【Lintcode】671. Rotate Words

題目地址:

https://www.lintcode.com/problem/rotate-words/description

給定一個字符串的列表,如果其中兩個字符串,其中一個可以通過rotate若干次得到另一個,就規定這兩個字符串等價。問這個列表裏的字符串有多少個等價類。

要判斷兩個字符串aabb是否等價,只需要判斷bb是否是a+aa+a的子串即可。而要數有多少個等價類的話,可以這樣操作:維護一個哈希表,然後遍歷那個字符串的列表,對每個字符串ss,先刪掉哈希表裏與之等價的字符串,然後再把ss加入哈希表。這樣形成的效果是,如果若干個字符串同屬於一個等價類,那麼哈希表只會把最後一個遍歷到的保留下來。這樣就達到了目的。代碼如下:

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Solution {
    /*
     * @param words: A list of words
     * @return: Return how many different rotate words
     */
    public int countRotateWords(List<String> words) {
        // Write your code here
        Set<String> set = new HashSet<>();
        
        for (String word : words) {
            String w = word + word;
            for (int i = 0; i + word.length() <= w.length(); i++) {
                set.remove(w.substring(i, i + word.length()));
            }
            
            set.add(word);
        }
        
        return set.size();
    }
}

時間複雜度O(nl2)O(nl^2)(for循環要循環ll次,而從哈希表裏刪除字符串也需要O(l)O(l)的時間,這是因爲hashCode方法要O(l)O(l)的緣故),ll是最長單詞的長度。空間複雜度O(nl)O(nl)

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