持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
这周的第二天了,家人们,距离周末已经不久了,大家准备准备嘿嘿嘿
仅执行一次字符串交换能否使两个字符串相等
该题出自力扣的1790题 —— 使序列递增的最小交换次数【简单题】
审题
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
- 这道题虽然是简单题,但是也还是错了几次的,因为边界的判断和一些经验的缺少
- 题意就是给出两个字符串,长度是一致的,如果仅仅因为两个字符的位置交换就可以替换成另一个字符的话,那么就可以返回true,否则的话,超过1个以上的转换次数就返回false
- 利用三个变量
- num:记录字符差异次数,如果true的话,必定只能有两个差异
- 记录首个差异的下标
- 记录第二个差异的下标
- 先进行剪枝动作,如果两个字符串相等的话,那么直接返回true
- 遍历字符串长度,判断如果当前字符不相等,那么差异加一,如果差异超过2,那么证明两个字符串必定不能转换后相等
- 最后遍历结束,进行二次判断,如果只存在一个差异。例如 "aa"和"ac"这种用例,就只有一个差异值
- 判断首个差异与第二个差异肯定就是对应的是s1字符串和s2字符串的换转
- 最后返回false作为兜底。
编码
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
if (s1.equals(s2))return true;
int num = 0,f= -1,s = -1;
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) != s2.charAt(i)){
num++;
if (num > 2){
return false;
}
if (num == 1) {
f = i;
}else {
s = i;
}
}
}
if (f != -1 && s != -1){
if (s1.charAt(f) == s2.charAt(s) && s1.charAt(s) == s2.charAt(f)) {
return true;
}
}
return false;
}
}