给定两个由小写字母构成的字符串 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

提示:

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. A 和 B 仅由小写字母构成。

暴力法超时:

class Solution {
public:
bool buddyStrings(string A, string B) {
int len1 = A.size();
int len2 = B.size();
if(len1 <= 1 || len2 <= 1 || len1 != len2)
return false;
for(int i = 0; i < len1; i++)
{
for(int j = i + 1; j < len1; j++)
{
swap(A[i], A[j]);
if(A == B)
return true;
else
swap(A[i], A[j]);
}
}
return false;
}
};

官方题解:

方法:情况列举

思路

如果 A[i] == B[i],我们就说 i 是匹配的,否则称 i 是不匹配的。亲密字符串几乎是完全匹配的,因为一次交换只会影响到两个索引。

如果交换 A[i] 和 A[j] 可以证明 A 和 B 是亲密字符串,那么就有 A[i] == B[j] 以及 A[j] == B[i]。 这意味着在 A[i], A[j], B[i], B[j] 这四个自由变量中,只存在两种情况:A[i] == A[j] 或 A[i] != A[j]

算法

让我们来看看这些情况。

在 A[i] == A[j] == B[i] == B[j] 的情况下,字符串 A 与 B 相等。因此,如果 A == B,我们应当检查每个索引 i 以寻找具有相同值的两个匹配。

在 A[i] == B[j], A[j] == B[i], (A[i] != A[j]) 的情况下,其余索引是相匹配的。所以如果 A 和 B 只有两个不匹配的索引(记作 i 和 j),我们应该检查并确保等式 A[i] == B[j] 和 A[j] == B[i] 成立。

class Solution {
public:
bool buddyStrings(string A, string B) {
int len1 = A.size();
int len2 = B.size();
if(len1 != len2 || len1 <= 1 || len2 <= 1)
return false;
if(A == B)
{
map<char, int> check;
for(int i = 0; i < len1; i++)
check[A[i]]++;
for(map<char, int> :: iterator itr = check.begin(); itr != check.end(); itr++)
{
if(itr ->second >= 2)
return true;
}
return false;
}
else
{
int first = -1;
int second = -1;
for(int i = 0; i < len1; i++)
{
if(A[i] != B[i])
{
if(first == -1)
{
first = i;
}
else if(second == -1)
{
second = i;
}
else
return false;
}
}
if(first != -1 && second != -1 && A[first] == B[second] && A[second] == B[first])
return true;
else
return false;
}
}
};

最新文章

  1. Matlab 循环读入和输出
  2. ubuntu下eclipse scala开发插件(Scala IDE for Eclipse)安装
  3. Spark Streaming容错的改进和零数据丢失
  4. 三、Spring——数据访问
  5. android studio clone 失败
  6. UVA5876 Writings on the Wall 扩展KMP
  7. linux,shell输入反斜杠显示&#39;W&#39;。
  8. Android 中类似ModelWindow的一个实现
  9. 在开发板Linux上挂载&quot;驱动&quot;挂载不成功,出现提示server 172.27.52.100 not responding, still trying
  10. BZOJ 3969 Low Power 解题报告
  11. redis 中文存储乱码问题
  12. Android实现通过手机找回密码
  13. thinkjs——一个字段一种数字代表两种状态
  14. Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
  15. usb驱动程序小结(六)
  16. ibatis中的resultMap
  17. GNU Wget 1.19.1 static built on mingw32
  18. C语言面试笔记(8/26)
  19. PythonStudy——数据类型总结 Data type summary
  20. [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践

热门文章

  1. golang Linux下编译环境搭建
  2. windows API 第九篇 _tcslwr _strlwr _wcslwr _mbslwr
  3. select有条件in要按照in中的数据排序
  4. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法
  5. php函数基础(一)
  6. 用Jmeter参数化实现接口自动化测试
  7. Django--csrf跨站请求伪造、Auth认证模块
  8. Leetcode151. Reverse Words in a String翻转字符串里的单词
  9. Leetcode103. Binary Tree Zigzag Level Order Traversal二叉树的锯齿形层次遍历
  10. Linux字体美化实战(Fontconfig配置)(转)