题目地址:
https://www.lintcode.com/problem/rotate-words/description
给定一个字符串的列表,如果其中两个字符串,其中一个可以通过rotate若干次得到另一个,就规定这两个字符串等价。问这个列表里的字符串有多少个等价类。
要判断两个字符串 a a a和 b b b是否等价,只需要判断 b b b是否是 a + a a+a a+a的子串即可。而要数有多少个等价类的话,可以这样操作:维护一个哈希表,然后遍历那个字符串的列表,对每个字符串 s s s,先删掉哈希表里与之等价的字符串,然后再把 s s s加入哈希表。这样形成的效果是,如果若干个字符串同属于一个等价类,那么哈希表只会把最后一个遍历到的保留下来。这样就达到了目的。代码如下:
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 ( n l 2 ) O(nl^2) O(nl2)(for循环要循环 l l l次,而从哈希表里删除字符串也需要 O ( l ) O(l) O(l)的时间,这是因为hashCode方法要 O ( l ) O(l) O(l)的缘故), l l l是最长单词的长度。空间复杂度 O ( n l ) O(nl) O(nl)。