题目描述:
给定一个字符串 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”]
输出:[]
示例 3:输入:s = “barfoofoobarthefoobarman”, words = [“bar”,“foo”,“the”]
输出:[6,9,12]
解法
用回潮法求出所有组合,然后用每个组合在字符串s中查找出现的位置。
代码java
public class T4 {
public static void main(String[] args) {
T4 t = new T4();
String word = "wordgoodgoodgoodbestword";
String[] words = new String[] { "word", "good", "best", "word" };
int[] used = new int[words.length];
t.dfs(0, words, used);
List<Integer> list = new ArrayList<>();
t.result.forEach((item) -> {
int indexOf = word.indexOf(item);
System.out.println(item);
if (indexOf > -1) {
list.add(indexOf);
}
});
for (Integer list2 : list) {
System.out.println(list2);
}
}
Set<String> result = new HashSet<>();
LinkedList<String> path = new LinkedList<>();
Set<Integer> set = new HashSet<>();
void dfs(int index, String[] words, int[] used) {
if (path.size() == words.length) {
result.add(convertStr(path));
return;
}
for (int i = 0; i < words.length; i++) {
if (used[i] == 1) {
continue;
}
path.add(words[i]);
used[i] = 1;
dfs(i + 1, words, used);
path.removeLast();
used[i] = 0;
}
}
String convertStr(LinkedList<String> path) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < path.size(); i++) {
sb.append(path.get(i));
}
return sb.toString();
}