找出一个字符串中不含重复字符的最长子字符串
2014-12-28 11:11
134 查看
找出一个字符串中不含重复字符的最长子字符串
采用动态规划,若已知以第i-1位字符为结尾的最长子字符串长度l[i-1],并知道第i-1位字符上一次出现的位置k,就可以求出以第i个字符为结束的最长子字符串(min(l[i-1]+1,i-k)。
遍历字符串就可以求出最长子串,时间复杂度为O(n),代码如下
#include "stdafx.h"
#include
using namespace std;
#define min(a, b) (((a) < (b)) ? (a) : (b))
void Find(const char* str,int len)
{
if(str == NULL)
{
return;
}
int prev[255];
for(int i=0; i<255; i++)
{
prev[i] = -1;
}
int *maxlen = new int[len];
maxlen[0] = 1;
prev[str[0]] = 0;
for(int i=1; i
{
if(prev[str[i]] == -1)
{
maxlen[i] =maxlen[i-1]+1;
}
if(prev[str[i]] != -1)//occur
{
maxlen[i] = min(maxlen[i-1]+1,i-prev[str[i]]);
}
prev[str[i]] = i;
}
int l = 0;
for(int i=0; i
{
if(l
{
l = maxlen[i];
}
}
for(int i=0; i
{
if(maxlen[i] == l)
{
for(int j = i-l+1; j<=i; j++)
{
cout<
}
cout<
}
}
}
int main(void)
{
const char* arr[] ={"ttdjb", "niceday", "helloworld",NULL};
for(int i = 0; arr[i]; ++i)
{
Find(arr[i],strlen(arr[i]));
}
//Find("abcabc",6);
return 0;
}
计算字符串中不包含重复字符的最大子字符串长度,算法应道尽可能高效。
例:“xabcdaef”中"xabcd"和"bcdaef"都不含重复字符的子字符串,其中"abcda"则是包含重复子字符串的。最大不含重复字符的子字符串"bcdaef"的长度是6,因此返回值:6。
int search(const char* test)
{
int lastPos[256]; //每个字符的上一次访问的元素位置
int maxLen = 0; //最大字符不重复字符子串长度
int curLen = 0; //记录当前字符不重复字符子串的长度
memset(lastPos,-1,sizeof(int) * sizeof(lastPos)); //记每个字符第一次访问的位置为-1
for (int i = 0; i < strlen(test); i++)
{
//如果当前字符位置与上次位置之间的距离 > 当前子字符串内的距离,
//则说明在当前curLen的范围内不存在当前字符的重复,所以curLen+1;
//否则当前curLen = i - lastPos[test[i]],即不重复字符字串长度为当前的字符
//与其上次位置之间的距离
if (i - lastPos[test[i]] > curLen)
{
curLen++;
maxLen = max(curLen,maxLen);
lastPos[test[i]] = i;
}
else
{
curLen = i - lastPos[test[i]];
lastPos[test[i]] = i;
}
}
return maxLen;
}
采用动态规划,若已知以第i-1位字符为结尾的最长子字符串长度l[i-1],并知道第i-1位字符上一次出现的位置k,就可以求出以第i个字符为结束的最长子字符串(min(l[i-1]+1,i-k)。
遍历字符串就可以求出最长子串,时间复杂度为O(n),代码如下
#include "stdafx.h"
#include
using namespace std;
#define min(a, b) (((a) < (b)) ? (a) : (b))
void Find(const char* str,int len)
{
if(str == NULL)
{
return;
}
int prev[255];
for(int i=0; i<255; i++)
{
prev[i] = -1;
}
int *maxlen = new int[len];
maxlen[0] = 1;
prev[str[0]] = 0;
for(int i=1; i
{
if(prev[str[i]] == -1)
{
maxlen[i] =maxlen[i-1]+1;
}
if(prev[str[i]] != -1)//occur
{
maxlen[i] = min(maxlen[i-1]+1,i-prev[str[i]]);
}
prev[str[i]] = i;
}
int l = 0;
for(int i=0; i
{
if(l
{
l = maxlen[i];
}
}
for(int i=0; i
{
if(maxlen[i] == l)
{
for(int j = i-l+1; j<=i; j++)
{
cout<
}
cout<
}
}
}
int main(void)
{
const char* arr[] ={"ttdjb", "niceday", "helloworld",NULL};
for(int i = 0; arr[i]; ++i)
{
Find(arr[i],strlen(arr[i]));
}
//Find("abcabc",6);
return 0;
}
计算字符串中不包含重复字符的最大子字符串长度,算法应道尽可能高效。
例:“xabcdaef”中"xabcd"和"bcdaef"都不含重复字符的子字符串,其中"abcda"则是包含重复子字符串的。最大不含重复字符的子字符串"bcdaef"的长度是6,因此返回值:6。
int search(const char* test)
{
int lastPos[256]; //每个字符的上一次访问的元素位置
int maxLen = 0; //最大字符不重复字符子串长度
int curLen = 0; //记录当前字符不重复字符子串的长度
memset(lastPos,-1,sizeof(int) * sizeof(lastPos)); //记每个字符第一次访问的位置为-1
for (int i = 0; i < strlen(test); i++)
{
//如果当前字符位置与上次位置之间的距离 > 当前子字符串内的距离,
//则说明在当前curLen的范围内不存在当前字符的重复,所以curLen+1;
//否则当前curLen = i - lastPos[test[i]],即不重复字符字串长度为当前的字符
//与其上次位置之间的距离
if (i - lastPos[test[i]] > curLen)
{
curLen++;
maxLen = max(curLen,maxLen);
lastPos[test[i]] = i;
}
else
{
curLen = i - lastPos[test[i]];
lastPos[test[i]] = i;
}
}
return maxLen;
}
相关文章推荐
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 从字符串中找出一个最长的不含重复字符的子字符串
- 16、JAVA 找出一个字符串中,第一个重复出现的字符
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 在一个字符串中找出第一次重复出现的字符
- 找出一个字符串中出现的重复的最长的字符子串
- C++找出字符串中最长的不含重复字符的子串
- 找出某一个字符串中不重复出现的第一个字符
- 05年华中科大机试第一题(对给定的一个字符串,找出有重复的字符,并给出其位置)
- 找出一个字符串中重复最多的字符以及出现的次数
- 用最少的代码找出一个字符串中第一个不重复出现(即只出现一次)的字符
- 给定任意一个字符串,找出所有重复字符的重复的次数
- 输出一个字符串所有排列。注意有重复字符
- 一道面试题:从一个字符串中找出第一个不重复字符;算法二;
- 3g:如何查找一个字符串中重复次数最多的字符,返回这个字符的个数和字符
- 求字符串中不含重复字符的最长子串的长度
- 找出字符串中重复的字符 打印出来
- 求字符串最长不含重复字符的子串长度
- 找出字符串中最大子串的长度(要求子串中的字符不重复)