打印匹配序列的编号,在用户给定的输入中为常量输入

Print number of matching sequence in the user given input for the constant input

本文关键字:输入 常量 用户 打印 编号      更新时间:2023-10-16

我写了一段代码来获取用户输入序列中出现的序列数。

这是我的密码。它排除了我希望测试的子序列。

我需要考虑12,23,341232341234作为序列。

不应考虑序列重叠(123中的12个不应考虑)。

例如,常数1234

用户给定号码124312341211423

输出:找到的序列号4

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main()
{
string num1;
string seq;
cout << "Enter constant number: ";
cin >> num1;
cout << "Enter the sequence: ";
cin >> seq;
int count=0;
for (int t=0; t<=num1.size()-2; t++)
{
string num = num1;
for (int k = num1.size(); k>=2-t ;k--)
{
cout << num <<"n";
if (t==2 && k<=2)
break;
//num=num.substr(t,t+k-1);
for (int j = 1; seq.find(num) != string::npos; j++)
{
seq = seq.substr(0,seq.find(num)) + " " + seq.substr(seq.find(num)+num.size());
count = count + 1;
}
num = num.substr(t,t+k-1);
}
cout<< seq << "n";
}
cout << "No. of sequences found: " << count << "n";
return 0;
}

嗨,我试着运行你的代码,结果发现它输出了5个序列。我想你的要求是想弄清楚为什么不是4。

我将提出几个建议:

  1. 应该调整for循环和形成num的逻辑,以测试num1的所有子字符串,使每个子字符串的长度至少为2个字符
  2. 将最内部的for循环更改为while循环,因为迭代器j实际上什么都不做
  3. 在最内部循环的每次迭代中调用string::find()一次。String::find()是昂贵的,并且您在不更改参数的情况下调用它三次
  4. 从for循环中取出num的声明,使其只声明一次

以下是这些建议的有效结果:

您会注意到,我添加了一个变量numStart来保存seqnum开头的位置,从而允许执行建议#3。

我还将cout << seq << "n"移动到最内部的循环中,这样每次找到序列时都可以看到seq的状态。

int main() {
string num1;
string num;
string seq;
cout << "Enter constant number: ";
cin >> num1;
cout << "Enter the sequence: ";
cin >> seq;
int count=0;
for (int t=0; t<=num1.size(); t++) {
for (int k = num1.size(); k>t+1; k--) {
num = num1.substr(t, k-t);
size_t numStart = seq.find(num);
while (numStart != string::npos) {
seq = seq.substr(0, numStart) + " " + seq.substr(numStart + num.size());
count++;
numStart = seq.find(num);
cout << seq << "n";
}
}
}
cout << "No. of sequences found: " << count << "n";
return 0;
}

我希望这能有所帮助!