完美度最大的子串
文章目录
//牛牛参加了一个文学比赛,比赛的规则是写一段话,使得这段话中不重复的字最多,当然还要有文采。一段话的完美度就是这段话中仅出现一次的字符个数。
现在牛牛写了N段话,他想把这N段话按顺序连在一起,然后从中找出一个最短连续子串,使得这个子串的完美度最高。
输入描述: 多组测试数据,对于每组测试数据: 第一行包含一个整数N,代表牛牛写了N段话 接下来包含N段话,每段话之间中空格隔开,均有大写字母组成。 保证:1<=N<=50,1<=Ai<=50
输出描述: 对于每组数据,输出一个字符串,代表完美度最高的最长连续 子串。如果有多个,输出最早出现的子串。
#include"stdafx.h"
#include<iostream>
#include <string>
using namespace std;
//方法一穷举法
//得到一个字符串的完美度
//int getPerfectDegree(string s){
// int length = s.size();
// int countt = 0;//完美度,也就是不重复字符个数
// int hashtable[256] = { 0 };
// for (int i = 0; i<length; i++)
// {
// hashtable[s[i]]++;
// }
// for (int i = 0; i<length; i++)
// {
// if (hashtable[s[i]] == 1)
// countt++;
// }
//
// return countt;
//}
//string getMaxSubstr(string s){
// int length = s.size();
// int D[2500][2500] = { 0 };
// for (int i = 0; i<length; i++)
// {
// for (int j = 0; j <= i; j++)
// {
// D[i][j] = getPerfectDegree(s.substr(j, i - j + 1));
// }
// }
// int maxx = 0;
// int row = 0;
// int col = 0;
// for (int i = 0; i<length; i++)
// {
// for (int j = 0; j <= i; j++)
// {
// if (D[i][j]>maxx)
// {
// maxx = D[i][j];
// row = i;
// col = j;
// }
//
// }
// }
// cout << maxx << endl;;
// return s.substr(col, row - col + 1);
//}
//方法二,当前结果基于前一次结果
void getMaxSubstr(string s)
{
int a[50][50] = { 0 };
string ans;
int iStrlen = s.size();
for (int i = 0; i < iStrlen; i++)
a[i][i] = 1;
for (int j = 1; j<iStrlen; j++) //第j列
{
int index1 = -1, index2 = -1;
for (int i = j - 1; i >= 0; i--) //首次出现位置
{
if (s[i] == s[j])
{
if (index1 == -1)//j之前重复1次
index1 = i;
else if (index2 == -1)//j之前重复多次
{
index2 = i;
break;
}
}
}
for (int i = 0; i<j; i++)
{
if (i>index1)//j之前未重复
a[i][j] = a[i][j - 1] + 1;
else if (i>index2 && i <= index1)//j之前重复一次
a[i][j] = a[i][j - 1] - 1;
else//j 之前重复多次
a[i][j] = a[i][j - 1];
}
}
//for(int i=0; i<iStrlen; i++)
//{
// for(int j=0; j<iStrlen; j++)
// cout<<a[i][j]<<" ";
// cout<<endl;
//}
int iStart = 0, iEnd = 0, iMax = 0;
for (int j = 0; j<iStrlen; j++)
{
for (int i = 0; i<iStrlen; i++)
{
if (a[i][j]>iMax)
{
iMax = a[i][j];
iStart = i;
iEnd = j;
}
}
}
ans = s.substr(iStart, iEnd - iStart + 1);
cout << a[iStart][iEnd] << endl;
cout << ans << endl;
}
int main(){
string s = "hello";
// cout<<s.substr(0,5);从0开始5个
/*cout << getMaxSubstr(s);*/
getMaxSubstr("aohhad");
return 0;
}