来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/buddy-strings
题目描述:
给你两个字符串 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
思路:
字符串s和g不属于亲密字符串的情况:
- s等长度不等于g的长度
- s和g不想等的字符不等于两个
- s和g字符的词频不同
字符串s和g属于亲密字符串的情况: - s和g只有两个字符不同,并且交换s或者g中这两个字符位置,s == g.
- s和g相同,并且s中有字符词频大于等于2
代码实现:
class Solution {
public boolean buddyStrings(String s, String g) {
int s_len = s.length();
int g_len = g.length();
// 长度不相同返回false
if (s_len != g_len) return false;
char[] a = new char[26];
char[] b = new char[26];
int idx = 0;
for (int i = 0; i < s_len; i++) {
int q = s.charAt(i) - 'a';
int p = g.charAt(i) - 'a';
a[q]++;
b[p]++;
if (q != p) idx++;
}
boolean flag = false;
for (int i = 0; i < 26; i++) {
// 有单词数量不相同返回false
if (a[i] != b[i]) return false;
if (a[i] > 1) flag = true;
}
return idx == 2 || (idx == 0 && flag);
}
}
网友评论