首页 > 其他分享 >力扣练习——70 串联所有单词的子串

力扣练习——70 串联所有单词的子串

时间:2022-08-15 13:48:17浏览次数:74  
标签:子串 单词 word int 力扣 vector words 70 include

1.问题描述

给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:

  s = "barfoothefoobarman",

  words = ["foo","bar"]

输出:0 9

解释:

从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。输出时,按照索引由小到大顺序输出。

 

示例 2:

输入:

  s = "wordgoodgoodgoodbestword",

  words = ["word","good","best","word"]

输出:-1

s中的子串无法由words串联得到,所以输出-1

 

可使用以下main函数:

int main()

{

    string s,str;

    vector<string> words;

    int n;

    cin>>s;

    cin>>n;

    for(int i=0; i<n; i++)

    {

        cin>>str;

        words.push_back(str);

    }

    vector<int> res=Solution().findSubstring(s, words);

    if (res.size()> 0)

        for(int i=0; i<res.size(); i++)

        {

            if (i> 0)

                cout<<" ";

            cout<<res[i];

        }

    else

        cout<<-1;

 

    return 0;

}

2.输入说明

首先收入字符串s,

然后输入words中单词的数目n,

最后输入n个字符串,表示words中的单词

3.输出说明

按照索引由小到大顺序输出,或者输出-1.

4.范例

输入

barfoothefoobarman
2
foo bar

输出

0 9

5.代码

#include<iostream>
#include<map>
#include<string>
#include<unordered_map>
#include<algorithm>
#include<string.h>
#include<sstream>
#include <vector>

using namespace std;

vector<int> findSubstring(string s, vector<string> words)
{
    int word_len = words[0].size();//每个单词长度
    int s_len = s.size();
    int word_cnt = words.size();//总共有m个单词
    if (word_len == 0 || s_len == 0 || word_cnt == 0) return vector<int>{};

    unordered_map<string, int>word;//记录每个单词出现的次数
    for (auto it : words)
        word[it]++;

    vector<int> res;//结果
    
    unordered_map<string, int>tmp;
    
    int j;
    for (int i = 0; (i+ word_len*word_cnt ) <= s.size(); i++)//这里等号必须要加,否则会出错
    {
        for ( j = i; j < (i+word_len*word_cnt); j+=word_len)
        {
            string tmp_s = s.substr(j, word_len);//易错点1:substr(index,len) 第一个参数为下标,第二个为截取的长度
            //判断截取的子串是否存在于word中,且次数是否相等
            if (word[tmp_s] == 0)//不存在该单词,直接退出
                break;
            else
            {
                tmp[tmp_s]++;//哈希表更新
                if (word[tmp_s] < tmp[tmp_s])//重复次数过多,也要退出
                    break;
            }
        }
        
        if (j == (i + word_len * word_cnt))//遍历到末尾了
            res.push_back(i);    
        tmp.clear();//每次遍历结束都要清空临时哈希表
    }
    return res;
}
int main()

{

    string s, str;

    vector<string> words;

    int n;

    cin >> s;

    cin >> n;

    for (int i = 0; i < n; i++)

    {

        cin >> str;

        words.push_back(str);

    }

    vector<int> res = findSubstring(s, words);

    if (res.size() > 0)

        for (int i = 0; i < res.size(); i++)

        {

            if (i > 0)

                cout << " ";

            cout << res[i];

        }

    else

        cout << -1;



    return 0;

}

 

标签:子串,单词,word,int,力扣,vector,words,70,include
From: https://www.cnblogs.com/juillard/p/16587978.html

相关文章

  • 70
    explode激增   figure数字sunset日落glass玻璃English英语head头shy害羞的extensive广阔的perform完成health健康colour颜色journey......
  • 力扣练习——69 前K个高频单词
    1.问题描述给一非空的单词列表,返回前k个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。 示例1:......
  • 华为5700三层交换机在生产场景中做策略路由
     我们在工作中经常会遇到这样的问题,就是有两条线路,一条电信一条移动,一条ADSL一条光纤。诸如此类的。但由于有三层交换机,我们往往把默认路由就指向了某一个出口。这样我......
  • 力扣 101. 对称二叉树
    101.对称二叉树给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输......
  • NC14701 取数游戏2
    题目链接题目题目描述给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数。假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑v......
  • 力扣 100.相同的数
    100.相同的树给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示......
  • NC13230 合并回文子串
    题目链接题目题目描述输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。我们定义字符串的价值为......
  • CodeForces-1702G Passable Paths
    PassablePathsLCA在树上找到形容一条链,只用找到链的两个端点即可,因此这题的初始想法就是找端点第一个端点:深度最深的地方第二个端点:离第一个端点最远的那个点找到两......
  • leetcode3-无重复字符的最长子串
    无重复字符的最长子串滑动窗口需要记录左边界left。当右边界移动的时候,如果新加入的字符已经存在,那么需要更新左边界,让left取左边界和上一个字符位置的最大值。之后更......
  • 力扣233(java)-数字1的个数(困难)
    题目:给定一个整数n,计算所有小于等于n的非负整数中数字1出现的个数。 示例1:输入:n=13输出:6示例2:输入:n=0输出:0 提示:0<=n<=109来源:力扣(LeetCode)链接:h......