字符串中最大子串问题

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

摘要生成于 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;
}
### C语言实现字符串最大子串算法 在C语言中,求解字符串最大子串通常指的是找到两个字符串之间的最长公共子序列(LCS)。以下是基于动态规划的方法来解决这一问题的示例代码: ```c #include <stdio.h> #include <string.h> // 动态规划法计算最长公共子串 void longestCommonSubstring(const char *str1, const char *str2) { int len1 = strlen(str1); int len2 = strlen(str2); // 创建二维数组存储中间状态 int dp[len1 + 1][len2 + 1]; memset(dp, 0, sizeof(dp)); int maxLength = 0; int endIndex = 0; for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (str1[i - 1] == str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; if (dp[i][j] > maxLength) { maxLength = dp[i][j]; endIndex = i - 1; } } else { dp[i][j] = 0; } } } // 输出最长公共子串 if (maxLength != 0) { char result[maxLength + 1]; strncpy(result, str1 + endIndex - maxLength + 1, maxLength); result[maxLength] = '\0'; printf("Longest Common Substring: %s\n", result); } else { printf("No common substring found.\n"); } } int main() { const char *str1 = "abcdefg"; const char *str2 = "xyzabcde"; longestCommonSubstring(str1, str2); return 0; } ``` 上述代码通过构建一个二维表 `dp` 来记录两字符串之间对应位置上的匹配情况。当发现连续相同的字符时,更新当前匹配长度并保存结束索引以便最终提取结果[^5]。 #### 关键点解析 - **初始化**:创建大小为 `(len1+1)*(len2+1)` 的二维数组用于存储每一步的状态。 - **状态转移方程**:如果当前位置字符相同,则继承左上角值加一;否则置零。 - **结果获取**:遍历过程中维护最大长度及其对应的终止下标,在最后依据这些信息截取目标子串[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值