开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、1790. 仅执行一次字符串交换能否使两个字符串相等
原题链接:1790. 仅执行一次字符串交换能否使两个字符串相等
题目描述:
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
/
示例 1:
输入:s1 = "bank", s2 = "kanb"
输出:true
解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
/
示例 2:
输入:s1 = "attack", s2 = "defend"
输出:false
解释:一次字符串交换无法使两个字符串相等
/
示例 3:
输入:s1 = "kelb", s2 = "kelb"
输出:true
解释:两个字符串已经相等,所以不需要进行字符串交换
/
示例 4:
输入:s1 = "abcd", s2 = "dcba"
输出:false
/
提示:
- 1 <= s1.length, s2.length <= 100
- s1.length == s2.length
- s1 和 s2 仅由小写英文字母组成
解题思路:
题目已经给定我们两个长度相同字符串s1和s2,要求我们判断字符串s2可否仅通过一次交换得到s1。
在最开始,我们应该先判断两个字符串s1和s2是否相等,相等就直接返回true即可。
通过思考,我们可以知道,交换一次,就会变动两个位置的字符,同时代表着字符串s2有两个位置的字符是与字符串s1不相同的,这么一来我们就找到了突破点。
我们同时遍历两个字符串,比较两字符串在相同位置的字符是否相等,如果不相等就将下标记录下来。
当我们记录下来的下标数量大于2时,就知道无法 仅执行一次字符串交换使两个字符串相等,直接返回false。
当遍历完成了,我们会得到两种情况:
①被记录下的下标只有一个,这也是无法通过最多一次交换相等的,false;
②被记录的下标有两个,这时候,我们需要判断字符串s2中,交换这两个位置的字符可以使得s2与s1相等。相等则返回true,否则返回false;
提交代码:
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
if(s1.equals(s2)) return true; //两个字符串相等,true
List<Integer> diff = new ArrayList<>(); //使用集合记录不相等字符的位置(下标)
for(int i = 0;i < s1.length();++i){ //遍历两个字符串
if(s1.charAt(i) != s2.charAt(i)) //相同位置下字符不相等
diff.add(i); //记录下来
if(diff.size() > 2) return false; //记录下的下标数大于2,false
}
if(diff.size() == 1) return false; //只有一个位置不等,也不符合,false
int a = diff.get(0),b = diff.get(1); //取出记录的下标
//判断交换位置后是否与s1相等
return s1.charAt(a) == s2.charAt(b) && s2.charAt(a) == s1.charAt(b);
}
}
提交结果: