【Lintcode】1169. Permutation in String

題目地址:

https://www.lintcode.com/problem/permutation-in-string/description

給定兩個字符串s1s_1s2s_2,判斷將s1s_1中的字符重排後能否成爲s2s_2的子串。題目保證字符串只含英文小寫字母。

先判斷s2s_2長度是否小於s1s_1,如果是則直接返回false。然後將s1s_1的各個字母出現的次數用一個整形數組記錄一下,接着開始遍歷s2s_2長度和s1s_1相等的子串,同時進行比較,一旦找到就返回true。代碼如下:

import java.util.Arrays;

public class Solution {
    /**
     * @param s1: a string
     * @param s2: a string
     * @return: if s2 contains the permutation of s1
     */
    public boolean checkInclusion(String s1, String s2) {
        // write your code here
        if (s2.length() < s1.length()) {
            return false;
        }
        
        int[] letters1 = new int[26], letters2 = new int[26];
        for (int i = 0; i < s1.length(); i++) {
            letters1[s1.charAt(i) - 'a']++;
            letters2[s2.charAt(i) - 'a']++;
        }
        
        if (Arrays.equals(letters1, letters2)) {
            return true;
        }
    
        for (int i = s1.length(); i < s2.length(); i++) {
        	// 添加新字母減掉出了窗口的字母
            letters2[s2.charAt(i) - 'a']++;
            letters2[s2.charAt(i - s1.length()) - 'a']--;
            if (Arrays.equals(letters1, letters2)) {
                return true;
            }
        }
        
        return false;
    }
}

時間複雜度O(l2)O(l_2)l2l_2s2s_2的長度,由於數組長度是常數,所以比較兩個數組是否相等可以看成所耗時間是常數。空間O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章