第二題:判定是否互為字符重排
給定兩個字符串 s1 和 s2莺丑,請編寫一個程序二跋,確定其中一個字符串的字符重新排列后,能否變成另一個字符串条辟。
示例 1:
輸入: s1 = "abc", s2 = "bca"
輸出: true
示例 2:
輸入: s1 = "abc", s2 = "bad"
輸出: false
說明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/check-permutation-lcci
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有弹渔。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán)胳施,非商業(yè)轉(zhuǎn)載請注明出處。
V1版本
這題的主體思路就是校驗兩個字符串中的每個字符出現(xiàn)的次數(shù)是否全一致肢专,V1繼續(xù)走簡單粗暴的方式
1.將其中一個字符串的字符以Map<字符舞肆,出現(xiàn)的次數(shù)>的形式維護(hù)到map集合中
2.遍例另外一個字符,校驗字符是否出現(xiàn)鸟召,出現(xiàn)就對map數(shù)據(jù)進(jìn)行次數(shù)減少操作胆绊,否則提前匹配失敗
代碼如下
public boolean CheckPermutation(String s1, String s2) {
// 提前校驗兩字符長度是否一致
if (s1.length() != s2.length()) {
return false;
}
// 提前校驗兩個字符是否一致
if (s1.equals(s2)) {
return true;
}
// 將s2的字符維護(hù)到map中
// Map<字符氨鹏,出現(xiàn)的次數(shù)>
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s2.length(); i++) {
// 字符第一次出現(xiàn)欧募,初始化到map中
if (!map.containsKey(s2.charAt(i))) {
map.put(s2.charAt(i), 1);
continue;
}
map.put(s2.charAt(i), map.get(s2.charAt(i)) + 1);
}
Integer num;
for (int i = 0; i < s1.length(); i++) {
if (!map.containsKey(s1.charAt(i))) {
return false;
}
num = map.get(s1.charAt(i));
if (num.equals(1)) {
map.remove(s1.charAt(i));
continue;
}
map.put(s1.charAt(i), map.get(s1.charAt(i)) - 1);
}
return true;
}
V2版本
v1版本基礎(chǔ)上進(jìn)行優(yōu)化,思路還是保持一致仆抵,就是校驗兩個字符串中的每個字符出現(xiàn)的次數(shù)是否全一致
這次不用map了跟继,改在數(shù)組來記錄出現(xiàn)的次數(shù),思路大概是
1镣丑,先初始化一個數(shù)組舔糖,值全初始化為0
2,同時遍例兩個字符對象莺匠,將字符根據(jù)ASCII碼減去A的ASCII金吗,s1中字符出現(xiàn)一次,相應(yīng)的位置進(jìn)行加1趣竣,s2則是減1
3摇庙,遍歷數(shù)組,看到有值非0的提前返回匹配失敗遥缕,否則匹配成功
代碼如下
public boolean CheckPermutation(String s1, String s2) {
// 提前校驗兩字符長度是否一致
if (s1.length() != s2.length()) {
return false;
}
// 提前校驗兩個字符是否一致
if (s1.equals(s2)) {
return true;
}
char A = 'A';
int[] array = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
for (int i = 0; i < s1.length(); i++) {
array[s1.charAt(i) - A]++;
array[s2.charAt(i) - A]--;
}
for (int num : array) {
if (num != 0) {
return false;
}
}
return true;
}