题目描述
给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。
给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。
测试样例:
“This is nowcoder”,”is This nowcoder”
返回:true
“Here you are”,”Are you here”
返回:false
思路一:
排序字符串。若两个字符串互为变为词,那么它们拥有同一组字符,只不过顺序不同。因此,对字符串排序,组成这两个变位词的字符就会有相同的顺序。我们只需比较排序后的字符串。
public boolean checkSam(String stringA, String stringB) {
if(stringA.length()!=stringB.length()) //长度不相等,返回false
return false;
char[] a = stringA.toCharArray(); //把字符串转化为字符数组,然后对字符数组进行排序
char[] b = stringB.toCharArray();
Arrays.sort(a);
Arrays.sort(b);
stringA = new String(a);
stringB = new String(b);
if(stringA.equals(stringB))
return true;
else
return false;
}
思路二:
检查两个字符串的各字符数是否相同。我们还可以充分利用变位词的定义–组成两个单词的字符数相同–来实现这个算法。我们只需遍历字母表,计算每个字符的次数。然后,比较这两个数字即可。
public boolean checkSam1(String stringA, String stringB) {
int lenA = stringA.length();
int lenB = stringB.length();
if(lenA != lenB){
return false;
}
int[] strA = new int[256];
int[] strB = new int[256];
for(int i = 0; i < lenA; i++){
strA[stringA.charAt(i)]++;
strB[stringB.charAt(i)]++;
}
for(int i = 0;i<256;i++){
if(strA[i]!=strB[i]){
return false;
}
}
return true;
}