打印用户输入的匹配序列号,用于常量输入

时间:2016-06-09 13:26:02

标签: c++

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

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

我需要将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;
}

1 个答案:

答案 0 :(得分:0)

您好我尝试运行您的代码,我得到了输出5个序列。我假设你的要求是弄明白为什么它不是4。

我会提出一些建议:

  1. 应调整for循环和形成num的逻辑,以测试num1的所有子字符串,使每个子字符串的长度至少为2个字符。
  2. 将最内部的for循环更改为while循环,因为迭代器j实际上没有做任何事情。
  3. 每次迭代最内部循环时调用string::find()一次。 String::find()价格昂贵,你可以在不改变参数的情况下调用它三次。
  4. num的声明从for循环中拉出来,因此它只声明一次。
  5. 以下是这些建议的结果:

    您会注意到我添加了变量numStart以保存numseq开头的位置,从而允许完成建议#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;
    }
    

    我希望这有帮助!