zoukankan      html  css  js  c++  java
  • [leetcode] Buddy Strings

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters in A so that the result equals B.

    Example 1:

    Input: A = "ab", B = "ba"
    Output: true
    

    Example 2:

    Input: A = "ab", B = "ab"
    Output: false
    

    Example 3:

    Input: A = "aa", B = "aa"
    Output: true
    

    Example 4:

    Input: A = "aaaaaaabc", B = "aaaaaaacb"
    Output: true
    

    Example 5:

    Input: A = "", B = "aa"
    Output: false

    分析:题目给两个字符串,要求判断这两个字符串是否有且仅有两个字符颠倒了顺序。根据题目的意思,不难想到直接用字面上的方法就可以解决了。首先排除一下两个字符串长度不等这种特殊的情况。然后记录每个不相等的位置。最后有两个位置不同时,判断一下;当没有位置不同(两个字符串相等)时,判断一下是否有重复出现的字符,有的话就是true,这里用一个set记录出现的字符,比较set和A的长度,也是一个小技巧了。代码如下:

     1 public boolean buddyStrings(String A, String B) {
     2         if ( A.length() != B.length() ) return false;
     3         int cur = 0;
     4         List<Integer> list = new ArrayList<>();
     5         while ( cur < A.length() ){
     6             char c_A = A.charAt(cur);
     7             char c_B = B.charAt(cur);
     8             if ( c_A != c_B ) list.add(cur);
     9             cur ++;
    10         }
    11         if ( list.size() == 2 ) {
    12             return A.charAt(list.get(0)) == B.charAt(list.get(1)) && A.charAt(list.get(1)) == B.charAt(list.get(0));
    13         }
    14         if ( list.size() == 0 ) {
    15            Set<Character> set = new HashSet<>();
    16            for ( char c : A.toCharArray() ) set.add(c);
    17            return set.size() != A.length();
    18         }
    19         return false;
    20     }

    代码还有可以优化的地方,现在跑的结果时5ms。可以合并一些操作,估计优化后理想的结果应该是3、4ms吧。

    这个题目没有什么太大的算法思想,考虑周全就好了。

  • 相关阅读:
    三、录制脚本Badboy录制脚本1
    三、录制脚本术语
    二、搭建Jmeter环境以及环境变量
    三、录制脚本Jmeter录制脚本2
    一、JMeter相关术语
    MySQL存储引擎
    创建线程CreateThread()
    关于category
    关于异常
    UIView和UIWindow
  • 原文地址:https://www.cnblogs.com/boris1221/p/9284641.html
Copyright © 2011-2022 走看看