字符串中最大子串问题

本文介绍了一种算法,用于从输入的字符串中找到最长的无重复字符子串及其长度。该程序支持字母、空格及逗号等字符,通过自定义映射将这些字符转换为整数进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一个字符串,输出其最大子串长度,即子串中任两个字符不相同 。本程序只能输入字母,空格以及逗号,并且不区分大小写,输出为第一个具有最大长度的子串以及其长度。

 

#include<iostream>
#include
<string>
using namespace std;

int chartoi(char c)
{
    
if(isalnum(c))
        
{
            
if(isalpha(c))
                
return tolower(c)-'a';
            
else
                
return c-'0'+26;
    }

    
else
        
if(isspace(c))
            
return 36;
        
else if(c==',')
            
return 37;
        
else
        
{
            cout
<<"error input char"<<endl;
            exit(
0);
        }

}


int substr(char* str, int len)
{
    
int A[38]={0};
    
int i,j;
    
int maxlen=0,templen;
    
int beg=0,end=0;
    
for(i=0,j=0;i<len,j<len; ++j)
    
{
        
int num=chartoi(str[j]);
        
if(A[num]==0)
            A[num]
=1;
        
else
        
{
            A[num]
+=1;
            
int step;
            
for(step=i;step<=j;++step)//
            {
                
int num1=chartoi(str[step]);
                
if(A[num1]>1)
                
{
                    
--A[num1];
                    
break;
                }

            }

        
            i
=step+1;

        }

        templen
=j-i+1;
        
if(templen>maxlen)
        
{
            beg
=i;
            end
=j;
            maxlen
=templen;
        }

    }

    
for(i=beg;i<=end;++i)
        cout
<<str[i];
    cout
<<endl;

    
return maxlen;
}


int main()
{
    
char str[]="good morning, everyone";
    cout
<<str<<endl;
    cout
<<substr(str,strlen(str))<<endl;
    
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值