目录
补发一下,原来忘记发了。
1.等值字串
【问题描述】如果字符串的一个子串(其长度大于1)的各个字符均相同,则称之为等值子串。试设计一算法,求出串S中一个长度最大的等值子串;如果串S 中不存在等值子串,则输出信息no
【输入形式】输入一个字符串,并以!结束
【输出形式】输出第一个出现的最长字符串,如果没有输出no
【样例输入】aabc123abc123cc!
【样例输出】aa
【样例输入】abceebccadddddaaadd!
【样例输出】ddddd
#include<bits/stdc++.h>
using namespace std;
int main(){
string c;
cin >> c;
int s = 0, num = 0, stemp = 0, a = 1;
int len = c.length();
for(int i = 1; i < len; i++){
if(c[i] == c[i - 1]) a++;
else {
if(a > num) {
num = a;
s = stemp;
}
stemp = i;
a = 1;
}
}
if(num > 1)
for(int i = s; i < s + num; i++){
cout << c[i];
}
else cout << "no";
}
2.KMP匹配
【问题描述】KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。
【输入形式】3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
【输出形式】每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
【样例输入】
string str
thisisalongstring isa
nosubstring subt【样例输出】
1
5
0
【提示】表示字符串的数据结构可以是字符数组或用串类实现。KMP算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。
#include<bits/stdc++.h>
#define M 2000
using namespace std;
/*typedef struct
{
char ch[ M ];
int len;
}SString;*/
//int next[ M ] ;
int KMP( string T , string P, int next[] ,int len1 , int len2 )
{
int i = 0 , j = 0;
while( i < len1 && j < len2 )
{
if( j == -1)
{
i++;
j=0;
}
else if( P[j] == T[i] )
{
i++;
j++;
}
else j = next[ j ];
}
if( j < len2 )
return -1;
else return i-j;
}
/*void getNext( string P , int next[] ,int len2 )
{
next[ 0 ] = -1;
int j = 0, k = -1;
while( j < len2 -1 )
{
if( k == -1)
{
next[ j + 1 ] = 0;
j++;
k=0;
}
else if( P[ k ] == P[ j ] )
{
next[ j + 1 ] = k + 1;
j++;
k++;
}
else
{
k = next[ k ];