我编写了一个代码来获取用户输入序列中出现的序列数。
这是我的代码。它排除了我希望测试的子序列。
我需要将12,23,34,123,234,1234视为序列。
不应考虑重复序列(不应考虑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;
}
答案 0 :(得分:0)
您好我尝试运行您的代码,我得到了输出5个序列。我假设你的要求是弄明白为什么它不是4。
我会提出一些建议:
num
的逻辑,以测试num1
的所有子字符串,使每个子字符串的长度至少为2个字符。j
实际上没有做任何事情。string::find()
一次。 String::find()
价格昂贵,你可以在不改变参数的情况下调用它三次。num
的声明从for循环中拉出来,因此它只声明一次。以下是这些建议的结果:
您会注意到我添加了变量numStart
以保存num
中seq
开头的位置,从而允许完成建议#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;
}
我希望这有帮助!