问答题 如何判断两个字符串是否由相同的字符组成
【正确答案】
【答案解析】问题描述:由相同的字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已,例如,“aaaabbc”与“abcbaaa”就由相同的字符组成的。下面讲述判断给定的两个字符串是否由相同的字符组成的方法。
方法一:排序法。最容易想到的方法就是对两个字符串中的字符进行排序,比较两个排序后的字符串是否相等。若相等,则表明它们是由相同的字符组成的,否则,则表明它们是由不同的字符组成的。实现代码如下:
import java.util.Arrays;
public class Test{
public static void compare(String s1, String s2){
byte[]b1=s1.getBytes();
byte[]b2=s2.getBytes();
Arrays.sort(b1);
Arrays.sort(b2);
s1=new String(b1);
s2=new String(b2);
if(s1.equals(s2))
System.out.println("equal");
else
System.out.println("not equal");
}
public static void main(String[]args){
String s1="aaaabbc";
String s2="abcbaaa";
compare(s1, s2);
s1="aaaabbc";
s2="abcbaab";
compare(s1, s2);
}
}
程序运行结果为:
equal
not equal
以上方法的时间复杂度取决于排序算法的时间复杂度,由于最快的排序算法的时间复杂度为O(nlogn),因此,该方法的时间复杂度也为O(nlogn)。
方法二:空间换时间。在算法设计中,经常会采用空间换时间的方法以降低时间复杂度,即通过增加额外的存储空间来达到优化算法的效果。就本题而言,假设字符串中只使用ASCII字符,由于ASCII字符共有266个(对应的编码为0~255),在实现时可以通过申请大小为266的数组来记录各个字符出现的个数,并初始化为0,然后遍历第一个字符串,将字符串中字符对应的ASCII码值作为数组下标,把对应数组的元素加1,然后遍历第二个字符串,把数组中对应的元素值-1。如果最后数组中各个元素的值都为0,说明这两个字符串是由相同的字符组成的;否则,说明这两个字符串是由不同的字符组成的。示例代码如下:
public class Test{
public static void compare(String s1, String s2){
byte[]b1=s1.getBytes();
byte[]b2=s2.getBytes();
int[]bCount=new int[256];
for(int i=0; i<256; i++){
bCount[i]=0;
}
for(int i=0; i<b1.length; i++)
bCount[b1[i]-"0"]++;
for(int i=0; i<b2.length; i++)
bCount[b2[i]-"0"]--;
for(int i=0; i<256; i++)
if(bCount[i]!=0){
System.out.println("not equal");
return;
}
System.out.println("equal");
}
public static void main(String[]args){
String s1="aaaabbc";
String s2="abcbaaa";
compare(s1, s2);
s1="aaaabbc";
s2="abcbaab";
compare(s1, s2);
}
}
程序运行结果为:
equal
not equal
与方法一相比,方法二多申请了额外的存储空间,但是提高了算法的效率,该算法的时间复杂度为O(n)。