题目描述
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
思路
做法是先检查这两个字符串的长度是否一致,如果不一致说明这两个 字符串是不可能相等的直接返回false。如果长度相同,假设出现字符的编码之在0-255之间,因为二进制的值是在0-255,我们可以先定义一个长度为256的数组命名为map,map[a]=[b]代表字符编码为a字符出现了的b次,初始时map[0…256]值都是0,遍历字符串str1,每次统计字符出现的数量,比如遍历到字符‘a’,他的编码是97,然后让map[97]++,map就成了str1中每种字符的词统计表,遍历字符串str2,每遍历到一个字符都在mao中把词频减下来,遍历到字符‘a’,其编码值是97,就令map[97]–,如果减少后的值小于0,就直接返回false,如果遍历完str2,map中的值也没出现负值,则返回true。
1)首先检查两个字符串长度是否一致,若不一致,则直接返回 false。
2)在对 s1 的字符进行遍历的过程中,进行累加过程。
3)在对 s2 的字符进行遍历的过程中,进行削减过程。
4)最后检查字符计数数组里面是不是全为 0 ,如果不是,说明有一个字符。
class Solution {
public boolean CheckPermutation(String s1, String s2) {
//判断字符串1和字符串2是否为空,字符串1的长度和字符串2的长度是否相等
if(s1 == null || s2 == null || s1.length() != s2.length()) return false;
char [] chstr1 = s1.toCharArray();//将字符串1转换为字符数组
char [] chstr2 = s2.toCharArray();//将字符串2转换为字符数组
int [] map = new int[256];//定义了一个字符的数组
for(int i = 0;i< chstr1.length;i++){//遍历字符串1,进行累加
map[chstr1[i]]++;
}
for(int i = 0 ;i < chstr2.length;i++){//遍历字符串2,进行自减
if(map[chstr2[i]]-- == 0){//如果减少的值为0,直接返回false
return false;
}
}
return true;
}
}