仅执行一次字符串交换能否使两个字符串相等

Posted Roam-G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅执行一次字符串交换能否使两个字符串相等相关的知识,希望对你有一定的参考价值。

给你长度相等的两个字符串 s1s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false

示例 1:

输入:s1 = "bank", s2 = "kanb" 输出:true 解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"

示例 2:

输入:s1 = "attack", s2 = "defend" 输出:false 解释:一次字符串交换无法使两个字符串相等

示例 3:

输入:s1 = "kelb", s2 = "kelb" 输出:true 解释:两个字符串已经相等,所以不需要进行字符串交换

我写的

public static boolean areAlmostEqual2(String s1, String s2) 
//        给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
//        如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
        if (s1.length() != s2.length()) 
//            长度不想等
            return false;
        
        if (s1.equals(s2)) 
//            完全一样的
            return true;
        
//      记录不想等的两个位置。x,y---只能交换一次
        int x = 0, y = 0;
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < s1.length(); i++) 
            if (s1.charAt(i) == s2.charAt(i)) 
//                字符相同 不记录
             else 
//                记录,
                list.add(i);
            
        
//        只取list中前两个数字 作为下标进行交换,对比两个字符串 想等就是true否则就是false
//        一定先判断list中的个数
        if (list != null && list.size() == 2) 
            x = list.get(0);
            y = list.get(1);
         else 
            return false;
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s1.length(); i++) 
            if (x == i) 
                sb.append(s1.charAt(y));
             else if (y == i) 
                sb.append(s1.charAt(x));
             else 
                sb.append(s1.charAt(i));
            
        
        if (s2.equals(sb.toString())) 
            return true;
         else 
            return false;
        
    

 官方提供的答案

  public static boolean areAlmostEqual(String s1, String s2) 
        int n = s1.length();
        List<Integer> diff = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) 
            if (s1.charAt(i) != s2.charAt(i)) 
                if (diff.size() >= 2) 
                    return false;
                
                diff.add(i);
            
        
        if (diff.isEmpty()) 
            return true;
        
        if (diff.size() != 2) 
            return false;
        
        return s1.charAt(diff.get(0)) == s2.charAt(diff.get(1)) && s1.charAt(diff.get(1)) == s2.charAt(diff.get(0));
    

总结,我做的思路官方提供的几乎一致。但是在代码实现的过程中,我写的代码显得过于繁多。

另外使用了StringBuilder,int x ,y等。。。使得代码运行速度较慢了。

应该直接判断两个字符串关键的字符是否相等,不必转化为完整的字符串再去比较。

应该尽可能的利用到list.size()的大小对应的情况,不必单独进行if()判断。

 

以上是关于仅执行一次字符串交换能否使两个字符串相等的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等

仅执行一次字符串交换能否使两个字符串相等

仅执行一次字符串交换能否使两个字符串相等

LeetCode 1790. 仅执行一次字符串交换能否使两个字符串相等 / 817. 链表组件 / 769. 最多能完成排序的块

「 每日一练,快乐水题 」1790. 仅执行一次字符串交换能否使两个字符串相等