[LeetCode] Substring with Concatenation of All Words

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).

这两天为了准备WAP的面试正好在练习JAVA,于是重写了这道题,发现JAVA果然好简洁。
思路就不说了,还是那个滑动窗口。
public class Solution {
    public ArrayList<Integer> findSubstring(String S, String[] L) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<Integer> ret=new ArrayList<Integer>();
        if ( S==null || L==null || L.length==0 )
            return ret;
        HashMap<String,Integer> words=new HashMap<String,Integer>();
       // HashMap<String,Integer> need =new HashMap<String,Integer>();
        for(int i=0;i<L.length;i++){
        	if ( words.containsKey(L[i]) ){
        		int t = words.get(L[i]);
            	words.put(L[i], t+1);
            	//need.put(L[i], t+1);
        	}else{
        		words.put(L[i],1);
        	//	need.put(L[i],1);
        	}
        	
        }
        
        int wordLength=L[0].length();
        for(int i=0;i<wordLength;i++){
        	HashMap<String,Integer> need =new HashMap<String,Integer>(words);
            int start=i,end=i;
            int needCnt=L.length;
            if ( (S.length()-start)< (wordLength*needCnt))
                break;
                
            for(;end<S.length();end+=wordLength){
            	if ( S.length()-end < wordLength )
            		break;
                String tmp= S.substring(end,end+wordLength);
                if (words.containsKey(tmp)){
                	int t=need.get(tmp);
                    need.put(tmp,t-1);
                    if ( t>0)
                        needCnt--;
                }
                
                if ( needCnt==0 ){
                    while(true){
                        String toRemove=S.substring(start,start+wordLength);
                        if (words.containsKey(toRemove) ){
                        	int t =need.get(toRemove);
                            if ( t <0 ){
                            	need.put(toRemove,t+1);
                            }
                            else
                                break;
                        }
                        start+=wordLength;
                    }
                    if (end-start == wordLength*(L.length-1))
                        ret.add(start);
                }
            }
        }
        return ret;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值