經典面試題34 - 字符串的全排列

問題

給定兩個字符串,如何判斷一個是否爲另一個的全排列字符串。

全排列 - 通過改變順序可以使得兩個字符串相等。

假設給定字符串 ‘bacda’和‘aabcd’, 其就是全排列字符串。

解答

如果不考慮運行效率,可以分別對兩個字符串進行排序,排序後的兩個字符串如果完全相等則返回true,反之返回false。

Java代碼如下:

     public String sort(String s) {
        char[] content = s.toCharArray();
        java.util.Arrays.sort(content);
        return new String(content);
    }
    
    public boolean permutation(String s, String t) {
        return sort(s).equals(sort(t));
    }   

上面思路的時間複雜度大於O(n)的,我們可以參考經典面試題33 - 字符串有無重複字符中的思路,

我們定義一個數組,其長度就是字符集的長度(字符串長度不相等不可能是全排列關係),其中預先填充所有值爲0。 首先遍歷一遍s1中的字符,將其對應位置增1,然後再遍歷s2,將其對應位置減1。

如果在遍歷s2的時候,發現數組中出現負數,則說明s2和s1不是全排列關係,返回false,若s2遍歷能夠完成,返回true。

Java代碼如下:

 public static boolean permutation(String s, String t) {
        if (s.length() != t.length()) return false; 
        
        int[] letters = new int[128]; // 假設是ASCII編碼集
        for (int i = 0; i < s.length(); i++) {
            letters[s.charAt(i)]++;
        }
          
        for (int i = 0; i < t.length(); i++) {
            letters[t.charAt(i)]--;
            if (letters[t.charAt(i)] < 0) {
                return false;
            }
        }
          
        return true; 
    }

更多

經典面試100題 - 持續更新中

獲取更多內容請關注微信公衆號豆志昂揚:

  • 直接添加公衆號豆志昂揚
  • 微信掃描下圖二維碼;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章