1. 程式人生 > 實用技巧 >30. 串聯所有單詞的子串-字串、hashmap-困難

30. 串聯所有單詞的子串-字串、hashmap-困難

問題描述

給定一個字串s和一些長度相同的單詞words。找出 s 中恰好可以由words 中所有單詞串聯形成的子串的起始位置。

注意子串要與words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮words中單詞串聯的順序。

示例 1:

輸入:
s = "barfoothefoobarman",
words = ["foo","bar"]
輸出:[0,9]
解釋:
從索引 0 和 9 開始的子串分別是 "barfoo" 和 "foobar" 。
輸出的順序不重要, [9,0] 也是有效答案。
示例 2:

輸入:
s = "wordgoodgoodgoodbestword",
words = ["word","good","best","word"]

輸出:[]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words

題解

//滑動視窗,每次維護一個長度為words所有單詞總長的s子串,在每個子串中search words中的每個單詞。
class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        if(s==null || words.length==0)return new ArrayList<Integer>();
        List
<Integer> result = new ArrayList<Integer>();//儲存結果 int i, j, len_s = s.length(), len_words = 0, len_words_each = words[0].length(), flag; for(String temp:words)len_words+=temp.length(); if(len_words > len_s)return result; for(i=0;i<len_s;i++){ flag
= 1; if(i+len_words <= len_s){ Map<String,Integer> map = new HashMap<String,Integer>();//重置map for(String temp:words){ if(map.containsKey(temp))map.put(temp,map.get(temp)+1); else map.put(temp,1); } String temp = s.substring(i,i+len_words); for(j=0;j<temp.length();j++){ if(j+len_words_each <= temp.length()){ String sub = temp.substring(j,j+len_words_each); if(map.containsKey(sub)){ if(map.get(sub) == 1)map.remove(sub); else map.put(sub,map.get(sub)-1); j = j+len_words_each-1; }else{ flag = 0; break; } } } }else break; if(flag == 1)result.add(i); } return result; } } /* 超時的全排列。。。。。。。。。。。。。。。。。。。 class Solution { public void dfs(List<String> pailie, int first, int len, List<String> res){ if(first == len){ StringBuilder s = new StringBuilder(); for(String temp:pailie) s.append(temp); if(!res.contains(s.toString()))res.add(s.toString()); } for(int i=first;i<len;i++){ Collections.swap(pailie, i, first); dfs(pailie, first+1, len, res); Collections.swap(pailie, i, first); } } public List<Integer> findSubstring(String s, String[] words) { if(s==null || words.length==0)return new ArrayList<Integer>(); List<Integer> result = new ArrayList<Integer>();//儲存結果 List<String> res = new ArrayList<String>();//儲存全排列結果 List<String> pailie = new ArrayList<String>(Arrays.asList(words));//將String[]型別的words轉為list,便於得到全排列 int len_words = words.length, len = s.length(), len_res, i; dfs(pailie, 0, len_words, res); len_res = res.get(0).length(); for(i=0;i<len;i++) if(i+len_res <= len && res.contains(s.substring(i,i+len_res)))result.add(i); return result; } } */