LEETCODE 刷题指南,无重复子串 纯C代码

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;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值