Leetcode 串联所有单词子串 Java

22 篇文章 0 订阅
14 篇文章 0 订阅
借鉴其他博主思路:

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer>  list=new ArrayList<>();
        if(words.length==0||s.length()==0||s==null) return list;
        Map<String,Integer> mapCount=new HashMap<>();
        for(String word:words) {
           mapCount.put(word, mapCount.containsKey(word) ? mapCount.get(word) + 1 : 1); //map用于单词出现次数计数
        }
        int n=s.length(),len=words[0].length(),num=words.length,j;
        Map<String,Integer> mapStore=new HashMap<>();
        for(int i=0;i<n-num*len+1;i++)    //循环到索引为n-num*len的字符即可,最后一个可能匹配子串
        {
           j=0;
          while(j<num)    //比较num个单词
          {
              String word=s.substring(i+j*len,i+(j+1)*len);
              if(mapCount.containsKey(word))
              {
                  mapStore.put(word,mapStore.containsKey(word)?mapStore.get(word)+1:1);
                  if(mapStore.get(word)>mapCount.get(word)) break; //比较出现次数,次数大于原words,则不符合,break
              }
              else{
                  break;
              }
              j++;      
          }
          if(j==num)     //符合则添加
              list.add(i);
          mapStore.clear();  //清空mapStore
        }
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值