zoukankan      html  css  js  c++  java
  • leecode第三十题(串联所有单词的子串)

    class Solution {
    public:
        void find(string s,vector<string> words, vector<int>& res,
                 int len_s,int len_words,int len_word)
        {
            vector<int> index;
            
            for(int i=0;i<len_s-len_word+1;i++)//对于每个字符,看是否是其中一个单词,是的话编码,不是的话取-1
            {
                bool flag=true;
                for(int j=0;j<len_words;j++)
                {
                    int k=0;
                    while(k<len_word && words[j][k]==s[i+k])
                        k++;
                    if(k==len_word)
                    {
                        index.push_back(j+1);
                        flag=false;
                        break;
                    }
                        
                }
                if(flag)
                    index.push_back(-1);
            }
            
            int length=index.size();
            int sum=0;//设立两个标准,一个是编码的和,一个是编码之间的异或,注意重复单词以第一个为准
            int chengji=0;
            for(int i=0;i<len_words;i++)
            {
                bool is_flag=false;
                for(int j=0;j<i;j++)
                {
                    if(words[j]==words[i])
                    {
                        sum+=j+1;
                        chengji= chengji ^ (j+1);
                        is_flag=true;
                        break;
                    }
                }
                if(!is_flag)
                {
                    sum+=i+1;
                    chengji=chengji ^ (i+1);
                }
                    
            }
            
            for(int i=0;i<length;i++)//对编码序列进行检测,满足上述两个标准的即可
            {
                int temp=i;
                int cur_sum=0;
                int cur_chengji=0;
                int j=0;
                while((temp+j*len_word<length) && j<len_words)
                {
                    cur_sum+=index[temp+j*len_word];
                    cur_chengji=cur_chengji ^ (index[temp+j*len_word]);
                    j++;
                }
                    
                if(cur_sum==sum&&cur_chengji==chengji&&j==len_words)
                    res.push_back(temp);
            }
        }
        
        vector<int> findSubstring(string s, vector<string>& words) {
            vector<int> res;
            int len_s=s.size();//把边界条件判断一遍
            int len_words=words.size();
    
            if(len_words==0 || len_s==0)
                return res;
    
            int len_word=words[0].size();
            if(len_s<len_word)
                return res;
            
            find(s,words,res,len_s,len_words,len_word);//进行查找
            
            return res;
        }
    };

     分析:

    好恶心。

  • 相关阅读:
    hdu 4747 Mex( 线段树? 不,区间处理就行(dp?))
    hdu 5692 Snacks(dfs时间戳+线段树)
    hdu 1864 最大报销额(背包)
    hdu 2955 Robberies(概率背包)
    hdu 4055 Number String (基础dp)
    4516: [Sdoi2016]生成魔咒
    2555: SubString
    后缀自动机·小记
    CF 1114 E. Arithmetic Progression
    CF 1114 D. Flood Fill
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10804666.html
Copyright © 2011-2022 走看看