【Lintcode】671. Rotate Words

题目地址:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值