给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。
示例 1:
输入: A = "ab", B = "ba"
输出: true
示例 2:
输入: A = "ab", B = "ab"
输出: false
示例 3:
输入: A = "aa", B = "aa"
输出: true
示例 4:
输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true
示例 5:
输入: A = "", B = "aa"
输出: false
提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A 和 B 仅由小写字母构成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/buddy-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
bool buddyStrings(string A, string B) {
int m = A.size(), n = B.size(), c = 0;
if (m <= 1 || m != n) return false;
vector<int> v;
int map[26] = {0};
bool flag = false;
for (int i = 0; i < n; i++) {
if (int m = ++map[A[i] - 'a']; m >= 2)
flag = true;
if (A[i] != B[i]) {
c++;
if (c > 2) return false;
v.push_back(i);
}
}
if (c == 1) return false;
else if (c == 0) return flag;
else return A[v[0]] == B[v[1]] && A[v[1]] == B[v[0]];
}
};
python3实现
class Solution:
def buddyStrings(self, A: str, B: str) -> bool:
s1 = ''
s2 = ''
if len(A) != len(B):
return False
elif A == B:
if len(set(A)) < len(A):
return True
else:
return False
else:
for i in range(len(A)):
if A[i] != B[i]:
s1 += A[i]
s2 += B[i]
if s1[0] == s2[1] and s1[1] == s2[0] and len(s1)==2:
return True
else:
return False
class Solution {
public boolean buddyStrings(String A, String B) {
int lenA = A.length();
int lenB = B.length();
if(lenA < 2 || lenA != lenB) {
return false;
}
int diffCount = 0;
char char1 = 0;
char char2 = 0;
HashSet<Character> charSet = new HashSet<>();;
for(int i = 0; i < lenA; i++) {
charSet.add(A.charAt(i));
if(A.charAt(i) != B.charAt(i)) {
if(diffCount == 0) {
char1 = A.charAt(i);
char2 = B.charAt(i);
}
else if(diffCount == 1) {
if(char1 != B.charAt(i) || char2 != A.charAt(i)) {
return false;
}
}
diffCount++;
}
}
return diffCount == 2 || charSet.size() < lenA;
}
}
C 实现:
void Swap(char* pCh1, char* pCh2)
{
char temp = 0;
temp = *pCh1;
*pCh1 = *pCh2;
*pCh2 = temp;
}
BOOL buddyStrings(CHAR pStrA[], CHAR pStrB[])
{
size_t length = strlen(pStrA);
BOOL blFlag = FALSE;
for (size_t i = 1; i < length; i++)
{
Swap(&pStrA[i-1], &pStrA[i]);
if (0 == strcmp(pStrA, pStrB))
{
blFlag = TRUE;
break;
}
}
return blFlag ? TRUE : FALSE;
}
bool isBuddyString(string str1, string str2) {
/判断是否为空和长度是否相等/
if (str1.empty() || str2.empty() || str1.size() != str2.size()) {
return false;
}
string::iterator str1b = str1.begin();
string::iterator str2b = str2.begin();
int swapTime = 0;
/遍历字符串/
while (str1b != str1.end()) {
/如果对应位置不相同/
if (str1b != *str2b) {
/两个字符串当前位置和下一位置的交叉比对,相同则记录交换次数,不同则直接返回false/
if ((str1b + 1) == str2b && *(str2b + 1) == *str1b) {
/交换次数大于1次返回false*/
if (swapTime >= 1) {
return false;
} else {
swapTime++;
str1b++;
str2b++;
}
} else {
return false;
}
}
str1b++;
str2b++;
}
return true;
}
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
Most helpful comment
python3实现