串联所有的单词字串(力扣30)

给定一个字符串 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”]
输出:[]

一开始的思路是dfs枚举出每个可能形成的排序顺序,然后去查找在s中是否存在,妥妥的超时,后面看题解,真正的解题思路应该是类似滑动窗口,由于每个单词长度是固定的,我们枚举S中的固定长度,同时建立两个哈希表,第一个预处理记录每个单词应出现的次数,后面那个哈希则用作匹配过程的记录,最后若两个表相同则发现一个匹配成功的,若在过程中发现某个单词无法匹配直接结束即可。

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> solve;
        int n=words.size();
        int len=s.size();
        if(n==0||len==0) return solve; 
        int g=words[0].size();
        unordered_map<string,int> p1;
        unordered_map<string,int> p2;
        for(int i=0;i<n;i++)
        {
            if(p1.find(words[i])==p1.end()) p1[words[i]]=1;
            else ++p1[words[i]];
        }
        for(int i=0;i<len-n*g+1;i++)
        {
            string temp1=s.substr(i,n*g);
            int l=0;
            bool vis=1;
            while(l<n*g)
            {
                string temp2=temp1.substr(l,g);
                if(p1.find(temp2)==p1.end())
                {
                    vis=0;
                    break;
                }
                else ++p2[temp2];
                l+=g;
            }
            if(vis)
            {
                if(p1==p2)
                {
                    solve.push_back(i);
                }
            }
            p2.clear();
        }
        return solve;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个关于多个一维字符数组的排序和显示的程序。主函数定义了一个二维字符数组 ch,包含 ROWS 个单词,每个单词最多 COLUMNS 个字母。然后定义一个字符数组指针 p,指向 ch。程序中有三个函数: 1. assign:通过键盘输入为多个一维字符数组(字串)赋值。 2. show:输出显示所有单词字串)。 3. sort:对多个一维字符数组(字串)进行排序。 需要补全这三个函数的实现。具体实现如下: ```c #include <stdio.h> #include <string.h> #define ROWS 10 #define COLUMNS 20 void assign(char (*arr)[COLUMNS], int rows){ printf("请输入 %d 个单词:\n", rows); for(int i=0; i<rows; i++){ scanf("%s", arr[i]); } } void show(char (*arr)[COLUMNS], int rows){ printf("单词排序结果为:\n"); for(int i=0; i<rows; i++){ printf("%s\n", arr[i]); } } void sort(char(*arr)[COLUMNS], int rows){ char temp[COLUMNS]; for(int i=0; i<rows-1; i++){ for(int j=0; j<rows-1-i; j++){ if(strcmp(arr[j], arr[j+1]) > 0){ strcpy(temp, arr[j]); strcpy(arr[j], arr[j+1]); strcpy(arr[j+1], temp); } } } } int main(void){ //ch为二维字符数组,包含ROWS个单词,每个单词最多COLUMNS个字母 char ch[ROWS][COLUMNS]; memset(ch,0,sizeof(ch)); //p是一个指向字符数组的指针,称为行指针,请参见教材Page189 //必须给p指定长度,否则编译不报错,运行也不报错,但会不正常 //p与ch等价,因此既可引用p,也可引用ch char (*p)[COLUMNS] = ch; //从键盘输入ROWS个单词,为ch赋值 assign(p, ROWS); //对ch中的ROWS个单词进行排序 sort(p, ROWS); //输出显示单词排序结果 show(p, ROWS); return 0; } ``` 在 sort 函数中,使用了 strcmp 函数来比较字符串大小,使用了 strcpy 函数来交换两个字符串。在 main 函数中,先将指针 p 指向 ch,然后调用 assign 函数为 ch 赋值,调用 sort 函数对 ch 进行排序,最后调用 show 函数输出排序结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值