字符串中的子序列号

时间:2012-05-08 17:48:17

标签: c++ algorithm

我获得了包含10个项目的数组中持续时间最长的数字

int list[] = {2,3,8,9,10,11,12,2,6,8};
int start_pos = 0;
int lenght=0; // lenght of the sub-~consetuve
for (int a =0; a <=9; a++ )
{

    if ((list[a]+1) == (list[a+1])) {
        // continue just the string;
        lenght++;
    } else {
        start_pos = a;
    }
}
cout << lenght  << " and start in " << start_pos;
getchar();

但它不起作用,它应该返回长度&amp; start_pos(3和长度4),因为最长的增长是从9,10,11,12,但它不起作用。

3 个答案:

答案 0 :(得分:0)

假设您实际上是指子序列,只需猜测序列开头的数字,然后运行线性扫描。如果你的意思是子串,那就更容易了 - 留给OP做练习。

线性扫描如下:

char next = <guessed digit>;
int len = 0;
char *ptr = <pointer to input string>;
while (*ptr) {
  if ((*ptr) == next) {
    next = next + 1;
    if (next > '9') next = '0';
    len++;
  }
  ptr++;
} 

现在用一个设置为从'0'到'9'的所有数字的循环包装它,你就完成了,选择一个给出最长的数字。

答案 1 :(得分:0)

简单的想法:序列的起点,终点和长度。

运行循环i

每当当前数字(在索引i处)小于下一个数字1 =&gt;时,

序列将开始。起点设置= i

当条件高于false =>时,它结束得到终点=&gt;得到length = end -start(使更多变量称为max来比较长度)=&gt;当序列结束时,结果可能是max,reset start point,end point = 0

答案 2 :(得分:0)

我自己做了:

#include <iostream>

using namespace std;
bool cons(int list[] , int iv) { bool ret=true; for (int a=0; a<=iv; a++) { if (list[a] != list[a+1]-1) ret=false; } return ret; }

void main() {
int str[10] = {12,13,15,16,17,18,20,21};
int longest=0;
int pos=0;
for (int lenght=1; lenght <= 9; lenght++) {
    int li[10];
    for (int seek=0; seek <= 9; seek++) {
        for (int kor=0; kor <= lenght-1; kor ++ ) {
            li[kor] = str[seek+kor];
        }
        if (cons(li , lenght-2)) {
            longest = lenght;
            pos=seek;
        } 
    }
}

for (int b=pos; b <= pos+longest-1; b++) cout << str[b] << " - "; cout << "it is the end!" << endl; getchar();


}