leetcode 859 亲密字符串
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 亲密字符串相关推荐
- LeetCode 859. 亲密字符串
1. 题目 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = &qu ...
- 859. 亲密字符串
859. 亲密字符串 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A ...
- 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列
今天是坚持每日一题打卡的第二十四天 题目链接:https://leetcode-cn.com/problems/buddy-strings/ 题解汇总:https://zhanglong.blog.c ...
- C++算法学习(力扣:859. 亲密字符串)
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 交换字母的定义是取两个下标 i 和 j (下标 ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) 15.3% 中 ...
- LeetCode实战:字符串相乘
题目英文 Given two non-negative integers num1 and num2 represented as strings, return the product of num ...
- LeetCode实战:字符串相加
题目英文 Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and ...
- leetcode——344. 反转字符串
leetcode--344. 反转字符串 问题概述: 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入 ...
- leetcode 344. 反转字符串 541. 反转字符串 II 双指针解
目录 leetcode 344.反转字符串 1.题目 2.思考 leetcode 541. 反转字符串 II 1.题目 2.思考 leetcode 344.反转字符串 1.题目 2.思考 典型的双指针 ...
最新文章
- ORACLE SQL机能优化系列(六)
- 多行列表右边距为零的实现方法
- 信息系统项目管理师-项目采购管理考点笔记
- dell服务器硬盘驱动器,DELL服务器WindowsServer2018系统安装-解决找不到安装在计算机的上地硬盘驱动器安装无法继续,要退出请按F3.doc...
- 客制化键盘键位修改_IQUNIX Slim87 RGB机械键盘评测
- 基于sigmoid的文本多标签分类模型代码实现
- 利用中继攻击解锁并开走汽车,本田不打算修复(含视频)
- 【C/C++】基本数据类型的隐式类型转换
- 分布式视频编码对比实验中H.264/AVC Intra 模式与H.264/AVC Inter Motion模式分析
- UPESB天气查询用例(三)
- Yarn无法查看日志: Aggregation may not be complete, Check back later or try the nodemanager at xxxx:xxxx
- sql怎么注销当前登录状态_4种方法教你获取Oracle数据库当前会话/进程的session id...
- 网络安全保障体系有哪些?网络安全保障需要如何实施?
- kron matlab_MATLAB中kron命令有什么用途
- python逆时针画圆_python 逆时针
- 蚂蚁金服与阿里云“双剑合璧”,加速释放金融科技时代新红利
- 印象笔记,为知笔记和 Effie 哪个适合学生呢?
- 「hdu6608」Fansblog 威尔逊定理
- 敏涵控股集团董事长刘敏:让世界了解敏涵 让敏涵走向世界
- US1MF-ASEMI贴片快恢复二极管US1MF
热门文章
- 计算机科学与技术大学教程,21世纪高等学校计算机科学与技术规划教材:大学计算机基础教程...
- oracle实现aes解密_Oracle的AES加密与解密用法
- IOError: encoder jpeg not available
- 级联MobileNet-V2实现CelebA人脸关键点检测(附训练源码)
- 【NIPS 2020】Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for...译读笔记
- Python Profiler 列举
- leetcode719:直线上的第k近点对
- 东大OJ-最大子序列问题的变形
- Windows中Git无法显示中文
- 敏捷开发团队管理系列之五:大型研发团队的切分(刚参加3.17 MDP团队管理场次的读者请看)...