859. 亲密字符串(模拟字符串)

859. 亲密字符串

给你两个字符串 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 由小写英文字母组成
复制代码
 1 class Solution {
 2 public:
 3     bool buddyStrings(string s, string goal) {
 4         // 两字符串长度不等,肯定非亲密字符
 5         if (s.size() != goal.size()) {
 6             return false;
 7         }
 8         vector<int> sChar(26);
 9         vector<int> goalChar(26);
10         int diffNum = 0; // 两字符串不同字符个数
11         for (unsigned int i = 0; i < s.size(); i++) {
12             int a = s[i] - 'a';
13             int b = goal[i] - 'a';
14             sChar[a]++;
15             goalChar[b]++;
16             // 相同索引对应字符不一样时,不同字符个数++
17             if (a != b) {
18                 diffNum++;
19             }
20         }
21         bool isExistSameChar = false;
22         for (int i = 0; i < 26; i++) {
23             // 存在字符出现次数不一样时肯定非亲密字符
24             if (sChar[i] != goalChar[i]) {
25                 return false;
26             }
27             // 存在重复字符
28             if (sChar[i] > 1) {
29                 isExistSameChar = true;
30             }
31         }
32         return (diffNum == 2) || (diffNum == 0 && isExistSameChar);
33     }
34 };
复制代码
posted @   跳动的休止符  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示