第一题:
题目描述:
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/buddy-strings
解题思路在代码中,见如下代码:
var buddyStrings = function(s, goal) {
// 如果字符串长度不等,直接返回 false
if(s.length!==goal.length) return false;
// 定义存储下角标的数组
let indexList =[];
// 将字符串变为值的形式
let new_s = s.split('');
let new_goal = goal.split('');
// 如果字符串不相等 eg.bab 和 abb 将两个下角标存入 indexList
for(var i = 0; i < new_s.length; i++) {
if(new_s[i] !== new_goal[i]) {
indexList.push(i);
}
}
// 不相等元素构成的数组的长度
let num = indexList.length;
// 如果是 abac 和 abad 不相等的部分只有一个,indexList 长度为 1,直接返回 false
if(num === 1) return false;
// 对字符串去重
let reset = [...new Set([...new_s])];
// 如果是 aa 和 aa, 它的 indexList 是 0,reset.length 是 1
// 如果是 ab 和 ab, 它的 indexList 是 0,reset.length 是 2
// reset.length 是去重后的字符串长度,new_s 是原始字符串长度
// 如果 reset.length != new_s.length,说明有重复的元素可以交换返回 true
// 如果 reset.length === new_s.length,说明都是单一的元素构成的字符串,返回 false
let same_item = reset.length === new_s.length;
// 如果字符串相等,eg.aaab 和 aaab 或者 ab 和 ab
if(num === 0) return !same_item;
// 不一样的元素超过题目规定的两个
if(num > 2) return false;
// 字符串不相等时,将 indexList 中存储的 下角标 对应的完成元素交换
if(num == 2) {
// 元素交换
let temp = 0;
temp = new_s[indexList[0]];
new_s[indexList[0]] = new_s[indexList[1]];
new_s[indexList[1]] = temp;
return new_s.join('') == new_goal.join('');
}
};
第二题:
题目描述:
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。
请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-number-of-frogs-croaking
解题思路在代码中,见如下代码:
var minNumberOfFrogs = function(croakOfFrogs) {
var n = croakOfFrogs.length;
// 定义每个字符的计数器
var count_c = 0;
var count_r = 0;
var count_o= 0;
var count_a = 0;
var count_k = 0;
var con = 0;
for(var i = 0; i < n; i++) {
const index = croakOfFrogs[i];
if(index === 'c') count_c++;
if(index === "r") count_r++;
if(index === "o") count_o++;
if(index === "a") count_a++;
if(index === "k") count_k++;
// 取叫声的最大值
con = Math.max(count_c, con);
// 如果字符顺序不同,不是有效字符串
if(count_c < count_r || count_r < count_o || count_o < count_a || count_a < count_k) return -1;
// 在一只青蛙连续叫的时候
if (count_k === 1) {
count_c--;
count_r--;
count_o--;
count_a--;
count_k--;
}
}
if(count_c==count_r&&count_r==count_o&&count_o==count_a&&count_a==count_k) return con;
else return -1;
};