LeetCode刷题---字符串---859
亲密字符串
859. 亲密字符串 - 力扣(LeetCode)
题目:
给你两个字符串 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 相等。
提示:
1 <= s.length, goal.length <= 2 * 104
s
和goal
由小写英文字母组成
自己的思路和代码:
思路:
可以分成两种情况:
第一种情况,是s与goal相等,当数组的长度等于1时,直接返回false。当数组的长度大于1时,查看s数组中有没有重复的元素,如果有返回true,没有返回false。
第二种情况,是s与goal不相等,同理,当数组的长度等于1时,直接返回false。当数组的长度大于1时,查看s数组和goal数组中是否正好有两个元素是不相等的,并且这两个元素是交叉相等的,返回true,否则返回false。
代码:
class Solution {
public:
bool buddyStrings(string s, string goal) {
if(s.size()!=goal.size()) return false;
if(s == goal) {
if(s.size()==1) {
return false;
} else {
int temp[26] = {0};
for(int i=0; i<s.size(); i++) {
temp[s[i] - 'a']++;
}
for(int i=0; i<26; i++) {
if(temp[i]>1) return true;
}
return false;
}
} else {
if(s.size()==1) return false;
int temp = 0;
char s_temp[2], g_temp[2];
for(int i=0; i<s.size(); i++) {
if(s[i] != goal[i]) {
if(temp<2) {
s_temp[temp] = s[i];
g_temp[temp] = goal[i];
temp++;
} else {
return false;
}
}
}
if(temp==1) return false;
if(s_temp[0]==g_temp[1] && s_temp[1]==g_temp[0]) {
return true;
} else {
return false;
}
}
//return true;
}
};