当前位置:编程学习 > C/C++ >>

最长不重复子串的高效实现

翻出了N年前找工时练习写的代码,觉得这个还可以,查找英文字符串中第一个出现的最长不重复子串。 只需要一次遍历即可,不过只适用于英文。

char* GetMaxSubStr( char*str )
{
    int hash[256]; //hash记录每个字符的出现位置
    int i = 0;
    for ( ;i< 256;i++)//初始化
    {
        hash[i] = -1;
    } www.zzzyk.com
    int CurrentStart=0,CurrentLength = 0,MaxStart=0,MaxEnd=0;
    int strLen = strlen( str );
    for(i=0;i<strLen;i++)
    {
        if(CurrentStart>hash[str[i]]) //如果没有重复
        {
            hash[str[i]]=i;
        }
        else
        {
            CurrentLength=i-CurrentStart; //当前长度
            if(CurrentLength>MaxEnd-MaxStart)//如果当前长度最长
            {
                MaxEnd=i;
                MaxStart=CurrentStart;
            }
            CurrentStart=hash[str[i]]+1; //更新当前最长的起点
            hash[str[i]]=i; //更新字符出现的位置
        }
    }
    if ( MaxEnd == 0 )//没有重复字符,返回源串
    {
        char*reStr = new char[ strLen+1 ];
        strcpy( reStr,str );
        return reStr;
    }
    int MaxLength=MaxEnd-MaxStart;
    char*reStr = new char[ MaxLength +1 ];
    memset( reStr,0,MaxLength+1);
    strncpy( reStr,str+MaxStart,MaxLength );
    return reStr;
}

摘自:ifeng专栏

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,