leetcode--30. Substring with Concatenation of All Words

问题

You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.

For example, given:
s: “barfoothefoobarman”
words: [“foo”, “bar”]

You should return the indices: [0,9].
(order does not matter).

意思就是给你一个字符串,和一个字符串的数组,需要返回一个该字符串的索引组成的数组,返回的索引有如下性质:从每个索引开始,长度为L的字串需要精确包含字符串数组中的所有字符串(不多不少)。L 为字符串数组中所有字符串长度之和。

思路

参考了leetcode的讨论,总结思路如下:用一个map将数组中的字符串放进去,key为字符串,value为该字符在数组中出现的次数。然后用两个指针遍历原来的字符串。i来控制需要返回的起始索引。j来控制截取字符串。每次从一段范围内截出一个词,判断该词是否在map中,如果没有则立刻跳出循环。如果有,再取出该字符串对应的value,如果等于1,就将他从map中移除,如果大于1则将value减一。最后如果map为空,说明所有的字符串都匹配。添加i到list中,跳出循环,开始下一轮循环。代码如下:

 public List<Integer> findSubstring(String S, String[] L) {
        List<Integer> res = new ArrayList<Integer>();
        if (S == null || L == null || L.length == 0) return res;
        int len = L[0].length();
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String w : L) map.put(w, map.containsKey(w) ? map.get(w) + 1 : 1);
        for(int i=0;i<=S.length()-len*L.length;i++){
            Map<String, Integer> copy = new HashMap<String, Integer>(map);
            for(int j=0;j<L.length;j++){
                String str = S.substring(i+j*len,i+j*len+len);//next word
                if(copy.containsKey(str)){
                    int count = copy.get(str);
                    if(count == 1) copy.remove(str);
                    else copy.put(str,count-1);
                    if(copy.isEmpty()){
                        res.add(i);
                        break;
                    }
                }else{
                    break;
                }
            }
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值