1、C语言字符串中 字符串数组和 字符串指针的区别 char[],和char *s
https://blog.csdn.net/Peggy_Chang/article/details/50457824
http://www.cnblogs.com/wxywxy/p/6883193.html、
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int lengthOfLongestSubstring(char* s);
char* p="test";
char a[]="Dalian";
// char b[6];
// strcpy(b,a);
// int i,j;
// for(i=0;i<6;i++)
// {
// printf("b[%d] is %c\n",i,b[i]);
// }
// puts(b);
// printf("p[0] is %c\n",p[0]);
int n=lengthOfLongestSubstring(p);
printf("n is %d\n",n);
}
//hash 思想查找无重复子串
int lengthOfLongestSubstring(char* s)
{
int size=0;
int longgest=1;
for(;*s!='\0';s++)
{
size++;
}
printf("size is %d \n",size);
int i=0;
int j=0;
int start;
char visit[1000];//Ascll 值监测对应的有无重复字段
for(i;i<size;++i)//外层循环遍历外边字符串
{
memset(visit, 0, sizeof(visit));//每次查找之前都要置0
visit[s[i]]=1;//该字段对应的hash设置为1 表示出现过
for(j=i+1;j<size;++j)
{
if(visit[s[j]]==0)
{
visit[s[j]]=1;
}
else{
if(j-i>longgest) {
longgest=j-i;
start=i;//记录无重复子串信息
}
break;
}
}
if((j==size)&&(j-i>longgest))
{
longgest=j-i;
start=i;//记录无重复子串信息
}
}
printf("longgest is %d\n",longgest);
printf("start is %d\n",start);
return longgest;
}
这篇博客详细叙述了,如何用数组和指针操作字符串
这篇文章写得很好,希望能帮到大家
思路:
ACSLL 双层循环匹配即为重复
动态规划+hash 算法如下
int lengthOfLongestSubstring(char* s)
{
char *temp=s;
int size=0;
for(;*temp!='\0';temp++){size++;}
int visit[128];//存储Ascll字符串
int *dp=(int*)malloc(sizeof(int)*size);//记录对应数组的下标
memset(visit,-1,sizeof(visit));//清空缓冲数据备用
memset(dp,0,sizeof(dp));//记录长度的值
visit[s[0]]=0;
int lastStart=0;
int longest=1;
int start=0;
int i;
dp[0]=1;
for(i=1;i<size;i++)
{
if(visit[s[i]]==-1)//未重复
{
visit[s[i]]=i;//记录该坐标
dp[i]=dp[i-1]+1;//更新长度
}
else//出现重复
{
if(lastStart<=visit[s[i]])
{
dp[i]=i-visit[s[i]];
lastStart=visit[s[i]]+1;//重新开始计
visit[s[i]]=i;//实时更新位置
}
else
{
dp[i]=dp[i-1]+1;
visit[s[i]]=i;
}
}
if(dp[i]>=longest)
{
longest=dp[i];
start=i-longest+1;
}
}
if(longest>=size){longest=size;}
return longest;
}