码迷,mamicode.com
首页 > 其他好文 > 详细

Substring with Concatenation of All Words

时间:2015-01-31 14:27:15      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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

对于这道题,有几个关键信息,1.每个单词的长度为定长,2.L中可能会有重复的单词

因此可以构建一个HashMap,用来保存L中单词及出现的次数,之后因为单词个数与长度都确定了,因此可以从S字符串中每次取出该定长的子字符串用来做对比,

1.看看该子字符串是否包含连续的单词

2.看看是否每个单词都出现了,且出现的个数和HashMap中一致,如果是,就添加该起始位置

 1 package Substring.with.Concatenation.of.All.Words;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 public class SubstringWithConcatenationofAllWords {
 9 public List<Integer> findSubstring(String S, String[] L) {
10       //最终结果
11      List<Integer> list=new ArrayList<Integer>();
12      //词典,用来保存L中出现的单词及次数
13      Map<String,Integer> dictionary=new HashMap<String,Integer>();
14      int wordsNum=L.length;
15      int wordLen=L[0].length();
16      int totalLen=wordsNum*wordLen;
17      //将L中的单词放在dictionary中
18      for(int i=0;i<wordsNum;i++){
19         if(dictionary.containsKey(L[i])){
20             int num=dictionary.get(L[i]);
21             num=num+1;
22             dictionary.put(L[i], num);
23         }else{
24             dictionary.put(L[i], 1);
25         }
26      }
27      //查找起始点
28     
29      for(int i=0;i<=S.length()-totalLen;i++){
30          String ss=S.substring(i,i+totalLen);
31          Map<String,Integer> currMap=new HashMap<String,Integer>();
32          while(true){
33          String subStr=ss.substring(0,wordLen);
34          if(dictionary.containsKey(subStr)){
35              if(currMap.containsKey(subStr)){
36                  int num=currMap.get(subStr);
37                  currMap.put(subStr,num+1 );
38                  if(num+1>dictionary.get(subStr)){
39                      break;
40                  }
41              }else{
42                  currMap.put(subStr, 1);
43              }
44              ss=ss.substring(wordLen);
45             if(ss.isEmpty()){
46                 for(Map.Entry<String, Integer> entry:dictionary.entrySet()){
47                     String currStr=entry.getKey();
48                     int num=entry.getValue();
49                     if(currMap.get(currStr)==null||num!=currMap.get(currStr)){
50                         break;
51                     }
52                 }
53                 list.add(i);
54                 break;
55             }
56          }else{
57              break;
58          }
59      }
60      }
61      return list;
62     }
63 public static void main(String args[]){
64     String S="aaa";
65     String []L={"a","b"};
66     SubstringWithConcatenationofAllWords service=new SubstringWithConcatenationofAllWords();
67     List<Integer>list=service.findSubstring(S, L);
68     for(int a:list){
69         System.out.println(a);
70     }
71 }
72 }

 

Substring with Concatenation of All Words

标签:

原文地址:http://www.cnblogs.com/criseRabbit/p/4263969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!