LeetCode - Substring with Concatenation of All Words

https://leetcode.com/problems/substring-with-concatenation-of-all-words/

因为包含L中所有string 的substring长度是固定的,所以从S的每个index开始,截固定长度的string,再和L中的挨个对比,因此把L中的字符串弄成一个hashmap,保存每个字符串及其出现次数。

注意:每次应该clone一个新的hashmap。

另外,由于长度固定,所以,当被检查的子字符串已经为空时,就说明对比成功了,不用再检查hashmap里面的次数是不是都为0了。

public class Solution {
    public List<Integer> findSubstring(String S, String[] L) {
        List<Integer> list = new ArrayList<Integer>();
        int wordlen = L[0].length();
        int totallen = wordlen*L.length;
        if(S.length() < totallen) return list;
        if(totallen == 0) return list;
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(String s : L){
            if(map.containsKey(s)){
                map.put(s, map.get(s)+1);
            }
            else map.put(s, 1);
        }
        
        for(int i=0; i<=S.length()-totallen; i++){
            HashMap<String, Integer> map2 = (HashMap<String, Integer>)map.clone();
            String current = S.substring(i, i+totallen);
            while(true){
                String word = current.substring(0, wordlen);
                if(map2.containsKey(word)){
                    int num = map2.get(word)-1;
                    if(num<0) break;
                    map2.put(word, num);
                }
                else break;
                current = current.substring(wordlen);
                if(current.length()==0){
                    list.add(i);
                    break;
                }
            }
        }
        return list;
    }
}

除了上面这种挨个检查的,还有这种 two pointer的方法,感觉效率会更高一些:

http://blog.youkuaiyun.com/linhuanmars/article/details/20342851

因为这种是O(n)的,而上一种是O(n^2)的哈。

实现方法还没仔细看。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值