30 Substring with Concatenation of All Words

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

For example, given:
S"barfoothefoobarman"
L["foo", "bar"]

You should return the indices: [0,9].

(order does not matter).

import java.util.*;
public class Solution {
    public List<Integer> findSubstring(String S, String[] L) {
        HashMap<String, Integer> map=new HashMap<String, Integer> ();
        List<Integer> result=new ArrayList<Integer>();
        if(S==null||S.length()==0||L==null||L.length==0) return result;
        int w=L[0].length();
        for(int i=0;i<L.length;i++){map.put(L[i],map.containsKey(L[i])? map.get(L[i])+1:1);}
        for(int i=0;i<=S.length()-L.length*w;i++){
            HashMap<String,Integer> tempmap=new HashMap<String, Integer>(map);
            for(int j=0;j<L.length;j++){
                String word=S.substring(i+j*w,i+j*w+w);
                if(tempmap.containsKey(word)){
                    int num=tempmap.get(word);
                    num=num-1;
                    if(num>0){
                        tempmap.put(word,num);
                    }else{
                        tempmap.remove(word);
                    }
                }else{
                    break;
                }
            }
            if(tempmap.isEmpty()){
                result.add(i);
            }
        }
        return result;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值