30. 串联所有单词的子串

题目:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

代码:
1.超时方法
class Solution { //回溯法,排列树,先求words中字符串所有组合,再比较是否匹配;
public List findSubstring(String s, String[] words) {

StringBuilder str=new StringBuilder();
List<Integer> list= new ArrayList<Integer>(); 
if(s==null||words.length==0){return list;}
backTrack(0,words,s,str,list);
return list;
}


public static void swap(String[] words,int i,int j){
    String temp=new String(words[i]);
    words[i]=words[j];
    words[j]=temp;
}

public  static void backTrack(int t,String[] words,String s,StringBuilder str,List<Integer> list){
if(t>=words.length){  //所有words字串都已在组合中    
    int i=0;
    while(i<=(s.length()-str.length())){    
      if(s.substring(i).contains(str.toString())&&!list.contains(s.indexOf(str.toString(),i))){     

//组合串在s.substring(i)中(组合串可能多次出现),words中有重复组合串会重复出现匹配情况所以要考虑下标是否存在,下标尚未存入list中
list.add(s.indexOf(str.toString(),i));
}
i++;
}
}
else{
for(int k=t;k<words.length;k++){
swap(words,t,k);
str.append(words[t]);
if(s.contains(str.toString())){ //s中包含了目前的字符字串,就有继续组合下去的必要,没有目前字串,后续再怎么组合都不可能了
backTrack(t+1,words,s,str,list);}
swap(words,t,k);
str.delete(str.length()-words[k].length(),str.length());
}

}

}

}

posted @   堤苏白  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示