题目介绍
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。
交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。
例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
示例 1:
输入:s = "ab", goal = "ba" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。 示例 2:
输入:s = "ab", goal = "ab" 输出:false 解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。 示例 3:
输入:s = "aa", goal = "aa" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。 示例 4:
输入:s = "aaaaaaabc", goal = "aaaaaaacb" 输出:true
提示:
1 <= s.length, goal.length <= 2 * 104 s 和 goal 由小写英文字母组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 先判断字符串长度是否相等,不相等就返回true
- 如果字符串完成相等,判断是否字符串里面是否有一个字符串出现两次以上,有的话就返回true
- 遍历字符,用数组存储s和goal的不相同字符串的位置
- 遍历结束判断数组中的长度是否大于2,大于2说明两个字符串不止有两个地方不同,返回false
- 如果数组等于2, 判断s字符串的第一个不同的位置和goal第二个不同的位置是否相等 且 s字符串的第二个不同的位置和goal第一个不同的位置是否相等, 条件成立返回true否则false
代码
/**
* @param {string} s
* @param {string} goal
* @return {boolean}
*/
var buddyStrings = function(s, goal) {
if (s.length != goal.length) return false
if (s === goal) {
return checkStr(s)
}
let arr = []
for (let i = 0 ; i < s.length ; i++) {
let si = s[i]
let gi = goal[i]
if (si !== gi) {
arr.push(i)
}
}
if (arr.length > 2) return false
return s[arr[0]] === goal[arr[1]] && s[arr[1]] === goal[arr[0]]
};
function checkStr(str) {
let map = {}
for (let i = 0; i < str.length; i++) {
if (!map[str[i]]) {
map[str[i]] = 1
} else {
return true
}
}
return false
}