当前位置: 首页 > news >正文

30. 串联所有单词的子串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。

s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。 “acdbef” 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

C++

class Solution {
public:
    string nstring(string str,int n){
        string result_str="";
        for( int i=0;i<n;i++ ){
            result_str.append(str);
        }
        return result_str;
    }
    unordered_map<string,int> list2map(vector<string>& temp_vector){
        unordered_map<string,int> result_map;
        for( string temp_str:temp_vector ){
                result_map[temp_str]++;
        }
        return result_map;
    }
    void refillmap(unordered_map<string,int>& result_map,unordered_map<string,int>& data_map){
        for( const auto& pair : result_map ){
            data_map[pair.first]=pair.second;
        }
    }
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> res;
        int length = words[0].size();//the length of the word.
        int total_length=length*words.size();//the total length of the word.
        if( total_length>s.size() ){
            return res;
        }
        unordered_map<string,int> result_map=list2map(words);
        unordered_map<string,int> data_map;
        refillmap(result_map,data_map);
        string target_str="";
        if(1==data_map.size()){
            target_str=nstring(words[0],words.size());
        }
        int gap=length;
        for( int i=0;i<s.size();i++ ){
            if( s.size()-i<total_length){
                break;
            }
            int n=words.size();
            if(1==data_map.size()){
                gap=total_length;
                string current_str=s.substr(i,gap);    
                if(current_str==target_str){
                    res.push_back(i);
                }
            }else{
                int a=i;
                int b=a+(words.size()-1)*length;
                while( a<=b && n>0 && a<=s.size()-gap && b>=0 ){
                    string current_str=s.substr(a,gap);
                    string last_str=s.substr(b,gap);
                    if(data_map[current_str]>0){
                        data_map[current_str]--;
                        n--;
                        a=a+gap;
                    }else{
                        break;
                    }
                    if(data_map[last_str]>0){
                        data_map[last_str]--;
                        n--;
                        b=b-gap;
                    }else{
                        break;
                    }
                }
                if(n<words.size() &&(s.size()-i-1)>=total_length){
                    refillmap(result_map,data_map);
                }
                if(0==n){
                    res.push_back(i);
                }
            }
        }
        return res;
        
    }
};

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

Java

class Solution {
    Map<String,Integer> list2map(String [] words){
        Map<String,Integer> result_map=new HashMap<String,Integer>();
        for( String str:words ){
            if(result_map.containsKey(str)){
                result_map.put(str,result_map.get(str)+1);
            }else{
                result_map.put(str,1);
            }
        }
        return result_map;
    }
    String nstring(String str,int n){
        StringBuilder strBuilder=new StringBuilder("");
        for( int i=0;i<n;i++ ){
            strBuilder.append(str);
        }
        return strBuilder.toString();
    }
    void refillmap(Map<String,Integer> result_map,Map<String,Integer> data_map){
        Set<String> keys = result_map.keySet();
        for( String key:keys ){
            data_map.put(key,result_map.get(key));
        }
    }
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> ans=new ArrayList<Integer>();
        int length=words[0].length();
        int total_length=words.length*length;
        if( s.length()<total_length ){
            return ans;
        }
        Map<String,Integer> result_map=list2map(words);
        Map<String,Integer> data_map=new HashMap<String,Integer>();
        refillmap(result_map,data_map);
        for( int i=0;i<s.length();i++ ){
            if( 1==data_map.size() && i+total_length<s.length() ){
                String targetString=nstring(words[0],words.length);
                String tempString=s.substring(i,i+total_length);
                if(targetString.equals(tempString)){
                    ans.add(i);
                }
            }else{
                int a=i;
                int b=a+(words.length-1)*length;
                int n=words.length;
                while(a<=b && a<=s.length()-length && b<=s.length()-length && b>=0 ){
                    String a_str=s.substring(a,a+length);
                    String b_str=s.substring(b,b+length);
                    if(data_map.containsKey(a_str)&&data_map.get(a_str)>0){
                        data_map.put(a_str,data_map.get(a_str)-1);
                        n--;
                        a=a+length;
                    }else{
                        break;
                    }
                    if(data_map.containsKey(b_str)&&data_map.get(b_str)>0){
                        data_map.put(b_str,data_map.get(b_str)-1);
                        n--;
                        b=b-length;
                    }else{
                        break;
                    }
                }
                if(n<words.length){
                    refillmap(result_map,data_map);
                }
                if(0==n){
                    ans.add(i);
                }
            }
        }
        return ans;
    }
}

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

Python

class Solution:
    def list2map(self,words: List[str]):
        result_map={};
        for str in words:
            result_map[str]=result_map.get(str,0)+1;
        return result_map;
    def refillmap(self,result_map):
        data_map={};
        keys=result_map.keys();
        for str in keys:
            data_map[str]=result_map[str]
        return data_map;
    def nstring(self,str,n):
        result_str="";
        for i in range(n):
            result_str=result_str+str;
        return result_str;

    def findSubstring(self, s: str, words: List[str]) -> List[int]:
        ans=[];
        length=len(words[0]);
        total_length=len(words)*length;
        result_map=self.list2map(words);
        data_map=self.refillmap(result_map);
        for i in range(len(s)):
            if 1==len(data_map) and (i+total_length<=len(s)):
                target_str=self.nstring(words[0],len(words));
                current_str=s[i:i+total_length];
                if target_str==current_str:
                    ans.append(i);
            else:
                a=i;
                b=a+(len(words)-1)*length;
                n=len(words);
                while a<=b and a<=len(s)-length and b>=0 and b<=len(s)-length:
                    a_str=s[a:a+length];
                    b_str=s[b:b+length];
                    if a_str in data_map and data_map.get(a_str)>0:
                        data_map[a_str]=data_map.get(a_str)-1;
                        n=n-1;
                        a=a+length;
                    else:
                        break;
                    if b_str in data_map and  data_map.get(b_str)>0:
                        data_map[b_str]=data_map.get(b_str)-1;
                        n=n-1;
                        b=b-length;
                    else:
                        break;
                if n<len(words):
                    data_map=self.refillmap(result_map);
                if 0==n:
                    ans.append(i);
        return ans;

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

相关文章:

  • My first Android application
  • 知识蒸馏知识点
  • C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合
  • 人工智能之数学基础:深入解析与应用线性空间中的基
  • 嵌入式之PWM
  • 【文件夹合并——树链剖分,树状数组】
  • Java爬虫获取亚马逊商品信息:按关键字搜索的实战指南
  • HarmonyOS NEXT技术全景与未来趋势指南(API12+)
  • 3D打印注塑件-省模具费90%的解决方案
  • 【mysql共享锁与排他锁】
  • HTTP入门
  • BGP配置华为——路径优选验证
  • DeepSeek 细节之 MLA (Multi-head Latent Attention)
  • 二级公共基础之数据结构与算法篇(八)排序技术
  • 优先级队列
  • 登录-03.登录校验-会话技术
  • vue和微信小程序处理markdown格式数据
  • 进程(Process)
  • LLVM编译器简介
  • QUdpSocket的readyRead信号只触发一次
  • 网站建设方案书安全性/seo课程
  • 网页设计与网站建设选择题/百度电脑端入口
  • 厦门哪里有建设网站的/舆情监测分析系统
  • 昆明哪些做网站建设的公司/自己有域名怎么建网站
  • 砀山网站建设/二级域名查询入口
  • 网站横幅怎做/可以免费发布广告的平台有哪些