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

思路1

算是一个比较繁琐的分类讨论的题目。首先,如果两个字符串交换后可能相等的话,那么至少这两个字符串应该是等长的,因此有:

if (s.size() != goal.size()) {return false;
}

再考虑下一种情况,也是本题相对最复杂的一点,也就是两个字符串相等怎么怎么处理。可以看到示例2的情况返回的是false。那么有没有可能返回true呢?

有,其实只要字符串本身中包含重复字母,那么我们只要交换这个重复字母即可实现一次"不变"的变换。这里通过统计每个字母出现的频率来判断是否重复,也可以使用一些更优雅的写法:

if (s == goal) {vector<int> count(26);for (int i = 0; i < s.size(); i++) {count[s[i] - 'a']++;if (count[s[i] - 'a'] > 1) {return true;}}return false;
}

接下来就是最后一种情况了。由于只允许交换一次,因此两个字符串只允许刚好两个位置不相同,并且这两个位置的字母应该是能够互相配对的,据此我们写出相应代码:

 int first = -1, second = -1;for (int i = 0; i < s.size(); i++) {if (s[i] != goal[i]) {if (first == -1)first = i;else if (second == -1)second = i;elsereturn false;}}return (second != -1 && s[first] == goal[second] && s[second] == goal[first]);

这里的first、second意为第一个不相同位置、第二个不相同位置所对应的下标。

完整代码如下:

 bool buddyStrings(string s, string goal) {if (s.size() != goal.size()) {return false;}if (s == goal) {vector<int> count(26);for (int i = 0; i < s.size(); i++) {count[s[i] - 'a']++;if (count[s[i] - 'a'] > 1) {return true;}}return false;} else {int first = -1, second = -1;for (int i = 0; i < s.size(); i++) {if (s[i] != goal[i]) {if (first == -1)first = i;else if (second == -1)second = i;elsereturn false;}}return (second != -1 && s[first] == goal[second] && s[second] == goal[first]);}
}

leetcode 859 亲密字符串相关推荐

  1. LeetCode 859. 亲密字符串

    1. 题目 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = &qu ...

  2. 859. 亲密字符串

    859. 亲密字符串 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A ...

  3. 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十四天 题目链接:https://leetcode-cn.com/problems/buddy-strings/ 题解汇总:https://zhanglong.blog.c ...

  4. C++算法学习(力扣:859. 亲密字符串)

    给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 交换字母的定义是取两个下标 i 和 j (下标 ...

  5. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) 15.3% 中 ...

  6. LeetCode实战:字符串相乘

    题目英文 Given two non-negative integers num1 and num2 represented as strings, return the product of num ...

  7. LeetCode实战:字符串相加

    题目英文 Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and ...

  8. leetcode——344. 反转字符串

    leetcode--344. 反转字符串 问题概述: 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入 ...

  9. leetcode 344. 反转字符串 541. 反转字符串 II 双指针解

    目录 leetcode 344.反转字符串 1.题目 2.思考 leetcode 541. 反转字符串 II 1.题目 2.思考 leetcode 344.反转字符串 1.题目 2.思考 典型的双指针 ...

最新文章

  1. ORACLE SQL机能优化系列(六)
  2. 多行列表右边距为零的实现方法
  3. 信息系统项目管理师-项目采购管理考点笔记
  4. dell服务器硬盘驱动器,DELL服务器WindowsServer2018系统安装-解决找不到安装在计算机的上地硬盘驱动器安装无法继续,要退出请按F3.doc...
  5. 客制化键盘键位修改_IQUNIX Slim87 RGB机械键盘评测
  6. 基于sigmoid的文本多标签分类模型代码实现
  7. 利用中继攻击解锁并开走汽车,本田不打算修复(含视频)
  8. 【C/C++】基本数据类型的隐式类型转换
  9. 分布式视频编码对比实验中H.264/AVC Intra 模式与H.264/AVC Inter Motion模式分析
  10. UPESB天气查询用例(三)
  11. Yarn无法查看日志: Aggregation may not be complete, Check back later or try the nodemanager at xxxx:xxxx
  12. sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
  13. 网络安全保障体系有哪些?网络安全保障需要如何实施?
  14. kron matlab_MATLAB中kron命令有什么用途
  15. python逆时针画圆_python 逆时针
  16. 蚂蚁金服与阿里云“双剑合璧”,加速释放金融科技时代新红利
  17. 印象笔记,为知笔记和 Effie 哪个适合学生呢?
  18. 「hdu6608」Fansblog 威尔逊定理
  19. 敏涵控股集团董事长刘敏:让世界了解敏涵 让敏涵走向世界
  20. US1MF-ASEMI贴片快恢复二极管US1MF

热门文章

  1. 计算机科学与技术大学教程,21世纪高等学校计算机科学与技术规划教材:大学计算机基础教程...
  2. oracle实现aes解密_Oracle的AES加密与解密用法
  3. IOError: encoder jpeg not available
  4. 级联MobileNet-V2实现CelebA人脸关键点检测(附训练源码)
  5. 【NIPS 2020】Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for...译读笔记
  6. Python Profiler 列举
  7. leetcode719:直线上的第k近点对
  8. 东大OJ-最大子序列问题的变形
  9. Windows中Git无法显示中文
  10. 敏捷开发团队管理系列之五:大型研发团队的切分(刚参加3.17 MDP团队管理场次的读者请看)...