字符串的最大子串问题

根据字符串找到其最大的字符子串 已知字符串比较大小的规则: a < ab; a < b; aba < ad; 给定字符串“dbdca”,请找出其最大的字符子串。 分析:对于字符串"dbdca",其子串可以是db, bdc, dca, ddc,要求最大的字符子串: 首先需要找到最大的字符,记录该字符串的位置; 从该位置之后的字符中找到最大的字符,加到步骤1中所求字符的后面; 重复步骤2,直到遍历至字符串的尾部。 这样的思路,是较为简单的。 int findMax(string str, int currPos) { 阅读详情

基于字符串的最大子串问题是经常面试的问题,想要表现的好不但要会基础的方法,同时还要学会优化的算法。

常考的有两个问题:

1:两个字符串的最大公共子串(还可能是子序列)

2:同一个字符串中相同的最大子串问题

例如输入qweabcuwabcfw,输出结果为:重复字符串的长度3和位置4

一:求两个字符串的最大公共子串


#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
char out[50];
vector<string> re;

int longestSubstring1(string x, string y,int &start) {
    int xlen = x.size();
    int ylen = y.size();
    if (xlen == 0 || ylen == 0) {
        return 0;   
    }
    int max = -1;
    //暴力破解法,两重for循环加 while
    for (int i = 0; i < xlen; i++) {
        for (int j = 0; j < ylen; j++) {
            int m = i, n = j;
            int len = 0;
            while (m < xlen && n < ylen) {
                if (x[m] != y[n]) {
                    break;
                }
                m++;
                n++;
                len++;
            }
            if (len > max) {
                max = len;
                start = i;
            }
        }
    }
    return max;
}
//动态规划
int longestSubstring2(string x, string y,int &start) {
   //设置dp数组
   vector<vector<int> > f(x.size() + 1, vector<int>(y.size() + 1, 0));
   //vector< vector<int> > f;
   int max = -1;
   for (int i = 1; i <= x.size(); i++) {
       for (int j = 1; j <= y.size(); j++) {
           if (x[i - 1] != y[j - 1]) f[i][j] = 0;
           else if (x[i - 1] == y[j - 1]) f[i][j] = f[i - 1][j - 1] + 1;
           if (max < f[i][j]) {
             max = f[i][j];
             start = i;
           }
       }
    }
    return max;
}


int main()
{
    string x = "adbccadbxadebbca";
    string y = "bcadrbxad";
    int start;
    int out =longestSubstring1 (x,y,start);
    cout << out << "-" << start << endl;
    for (int i=0; i<out ;++i)
    cout << x[start + i];
    cout << endl;
    
    cout << longestSubstring2(x,y,start) <<"-" << start;
    
return 0;

}

2:c语言的写法

#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
char out[50];
vector<int> myvector;
int fun(char* a , char *b)
 {
  int len_a = strlen(a);
  int len_b = strlen(b);
    if(len_a<=0||len_b<=0)
        return -1;
    char * c , *d;
    if(len_a<len_b)
    {
     c = b;
     d = a;
    }
     else
     {
         c =a ;
         d =b;
     }
    int max =0; 
  for( ; *c!='\0';c++ )
  {
      int n = 0; //n是个遍历指针,判断首字母是否相等
      for( ;*(d+n)!='\0'; ++n)
      {
       if(*c !=*(d+n))
       {
        continue;
       }
       else
       {
           int len =0;
           while(*(c+len)!='\0'&&*(c+len)==*(d+n+len)&&*(d+n+len)!='\0')
           {
           len++;
           }
           if(len>max)
           {
              max =len;
           {
                   for( int m=0;m <max;m++)  
                    {  
                        out[m]=*(c+m);  
                    }  
                    out[max]='\0';
           }
           }
    
       }
                    
      }     
       
  }
    
    return max;
 }

int main()
{
    char a[] ="adbccadbxadebbca";
    char b[]= "bcadrbxad";
    int len =fun(a,b);
    
    cout << out << endl;
    //cout << 0;
return 0;

}

还有别人的一个递归的解法,没看太懂,贴出来你们欣赏吧!

#include <iostream>
#include <string>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
//#include <windows.h>
using namespace std;


char findMaxStr(char * s1,char *s2){
    char *ss;
    static int maxlen=0;
    int len;
    if(strstr(s1,s2))  //如果S2是S1的子串
    {
        if(maxlen<strlen(s2))
        {
            maxlen=strlen(s2);
            printf("maxlen:%d result:%s\n",maxlen,s2);
        }
        return 0;
    }
    len=strlen(s2);
    if(len==1)
    {    //递归的出口函数,终止条件
        //printf("error\n");
        //return 1;
        return 1;
    }
    ss=(char *)malloc(len);
    memcpy(ss,s2,len);//内存拷贝函数
    ss[len-1]=0;
    //printf("len=%d str=%s\n",len-1,ss);
    findMaxStr(s1,ss); //是否需要注释掉??
    memcpy(ss,s2+1,len); //后移一位
    //printf("second: len=%d str=%s\n",len-1,ss);
    findMaxStr(s1,ss); //递归
    free(ss);
    return 1;
}

int main() 
{
    char a[200]="adcyioabcdefxxabcdxxx";
    char b[200]="mxx0";


    findMaxStr(a,b);
    return 0;
}

二:字符串的最长公共子串

这实质上是第一道题的变形,例如输入qweabcuwabcfw,输出结果为:重复字符串的长度3和位置4

 

第一种解法:以字符串的长度为外循环,内循环从字符串的第一个元素开始向后移动。

#include<iostream>
#include<string>
using namespace std;
int main()
{
string str, tep;
cout << "输入字符串" << endl;
cin >> str;
cout <<str.size()<<endl;
int mysize = str.size();
    int k =0;
    int max =0;
    int first;
for (int i = 1; i <mysize; i++)
{
for (int j = 0; j < mysize-i; j++)
{
    if (str[j]==str[j+i])
    {
        k++;
    }
    else
    {
        k=0;
    }
    if(k>max)
   {
     max = k;
     first =i-k+1;
    }
}
}
    cout << first << "-" << max <<endl;
return 0;

}

第二种解法

 

题目:输入一行字符串。找出当中出现的同样且长度最长的字符串,输出它及其首字符的位置。

               比如:“yyabcdabjcabceg",输出结果应该为abc 和3.

#include<iostream>
#include<string>
using namespace std;
int main()
{
string str, tep;
cout << "输入字符串" << endl;
cin >> str;
for (int i = str.length() - 1; i > 1; i--)
{
for (int j = 0; j < str.length(); j++)
{
if (j + i <= str.length())
{
size_t t = 0;
size_t num = 0;
tep = str.substr(j, i);//从大到小取子串,从j位置开始取长度为i的子串
t = str.find(tep);//正序查找
num = str.rfind(tep);//逆序查找
if (t != num)//假设两次查找位置不一致,说明存在反复子串
{
cout << tep << " " << t + 1 << endl;//输出子串及位置
system("pause");
return 0;


}
}
}
}
}
substr(j, i);//从大到小取子串,从j位置开始取长度为i的子串
t = str.find(tep);//正序查找
num = str.rfind(tep);//逆序查找
if (t != num)//假设两次查找位置不一致,说明存在反复子串
{
cout << tep << " " << t + 1 << endl;//输出子串及位置
system("pause");
return 0;


}
}
}
}
}

 

java匹配两个字符_java实现字符串匹配问题之求两个字符串的最大公共子串 转载请注明出处:http://blog.youkuaiyun.com/xiaojimanman/article/details/38924981近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串。算法思想:基于图计算两字符串的公共子串。详细算法思想參照下图:输入字符串S1:achmacmh 输入字符串S2:macham1)第a步,是将字符串s1,... 阅读详情

相关推荐

cellranger安装以及使用

接受cellranger count的输出数据,将同一组的不同测序样本的表达矩阵整合在一起,比如tumor组原来有4个样本,PBMC组有两个样本,现在可以使用aggr生成最后的tumor和PBMC两个矩阵,并且进行标准化去掉测序深度的影响。但是由于病毒基因组太小了,且注释结果只有CDS没有exon,所以曲线救国,将CDS整体替换为exon,也不进行过滤了,直接下一步。虽然安装完毕,但是现在要运行cellranger的话需要在终端输入cellranger的整个路径。自动执行这个命令,需要将“

m0_59974475的博客 9396

最大子串算法

采用Kadane算法求解最大子串和问题(线性时间复杂度情况下结题)

NEWPLAN的专栏 1万+

STM32F103用软件I2C读取IP2366电量数据,实测避坑指南(附完整源码)

本文详细介绍了如何使用STM32F103的软件I2C驱动读取IP2366电池管理芯片的电量数据,包括GPIO初始化、I2C时序实现、关键延时优化及常见问题解决方案。通过实测避坑指南和完整源码,帮助开发者快速实现稳定的电量数据读取,适用于嵌入式电池管理系统开发。

weixin_33725722的博客 515

【C/C++刷题——leetcode】查找字符串中最大的子串

leetcode刷题,刷完这题字符串的题目,可以使你更加充分了解C语言字符串操作和C++ STL 库string类的操作

m0_62599305的博客 1784

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 774

子序列和子串问题算法的全面总结

1.分清楚什么是子串,什么是子序列 看文章前首先要搞清楚什么是子序列,什么是子串;子序列是指一个字串中非连续的字串,例如:字串A:123456789 它有一个子序列a:13579(非连续) 它有一个子串b:12345(连续)。 2.有关子串问题的算法 (1)最大子串 何为最大子串,例如:最大子串是要找出由数组成的一维数组中和最大的连续子串。比如{5,-3,4,2}的最大子串就是 {5,-3...

qq_41633237的博客 1万+

YOLOv10改进 | 代码逐行解析(三) | YOLO中的Mosaic增强详解(新手入门必读系列)

本文给大家带来的是YOLOv10中的Mosaic增强代码的详解,可能有部分人对于这一部分比较陌生,有的读者可能知道Mosaic增强但是不知道其工作原理,具体来说Mosaic增强就是指我们的数据集中的图片在输入给模型之前的一个处理过程(我们的图片并不是直接就输入给模型了,大家的训练结果中的结果检测图片大家可以看到数据集中多个图片会组合在一起这就是简单的Mosaic增强),下面我就来讲解一下其在YOLOv10中工作原理和代码定义,下面图片为一个Mosaic增强后的图片。​。

Snu77的博客 2077

一段字符串寻找最大的子字符串

一段字符串寻找最大的子字符串 思路:字符串:例子:iosiosios *从第一个i开始一直加到第一个s:后遇到第二个i,此时,将ios作为一个子字符串保存下来,再寻找下一个不重复子字符串osi,以此循环,每次找到下一个子字符串前先跟前一个子字符串进行比较。如果当前子字符串长度大于前一个子字符串,则替换。循环往复,直到最后一个子字符串。 在这里插入代码片 ...

jalyy的博客 1502

机器人在果园内行巡检仿真(2D雷达、realsense相机)

DiffBot是一种具有两个轮子的自主差动驱动机器人。它的主要处理单元是一个运行Ubuntu Mate 20.04和ROS 1 (ROS Noetic)中间件的Raspberry pi4b。该存储库包含ROS驱动包、真实机器人的ROS控制硬件接口和模拟DiffBot的配置。修改配置文件orchard_world.launch。

如果想成为中心,那么就到中心去吧。 1312

RTDETR最强结构图 | 包含模型整体结构图 | 全模块展开图 | AiFi模块展开图

RT-DETR 最全结构图

Coding... 9600

java实现字符串匹配问题之求两个字符串的最大公共子串

本文通过简单的事例阐述字符串对比的算法思想,并用java给予实现。该算法可以用于求两个字符串的子串、最大子串等。

小鸡慢慢的专栏 8396

VTK API 详解(134):vtkOBJWriter - 写入 OBJ 模型

是 VTK 中用于将数据写入 Wavefront OBJ 文件格式的类。OBJ 格式是广泛支持的 3D 网格模型格式,支持顶点、面和基本几何信息的保存,便于模型在多种三维软件间交换。

yumeiguo的博客 140

字符串中最大子串问题

输入一个字符串,输出其最大子串长度,即子串中任两个字符不相同 。本程序只能输入字母,空格以及逗号,并且不区分大小写,输出为第一个具有最大长度的子串以及其长度。 #includeiostream>#includestring>using namespace std;int chartoi(char c)...{    if(isalnum(c))        ...{         

SeeSeaBee的专栏 1426

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

动态规划求解两个字符串的最大公共子串问题

最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少。比如:"abcdkkk" 和 "baabcdadabc",可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。请分析该解法的思路,并补全划线部分缺失的代码。#include &lt;stdio.h&gt; #include &lt;st...

HowtobeaHERO的博客 2522

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于如何求两个字符串的最大公共子串的问题

此方法对于长度较短的字符串效率较高: #include <stdio.h> #include <string.h> int f(char s1[],char s2[]) { int a[100][100]; int len1 = strlen(s1); int len2 = strlen(s2); int i,j; memset(a,...

Kobe_G的博客 424

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

求两字符串最大公共子串长度问题(104)

方法一(暴力法):利用三层循环进行逐个筛选,具体思想如下,从子串1的第i个字符开始,如果它与子串2的第j个字符相同,则证明从此位置开始公共子串开始出现,则同时加1判断后一个字符是否相同(这里隐含的将这个可能成为最大子串的起始位置保存了下来,也就是i),若后一个出现不相同了,则证明公共子串已结束,然后更新最大公共串长和最大串长的起始位置,若一开始就不相同则证明以子串1第i个位置为起始位置,子串2第j个位置开始不会出现公共子串,那么就判断子串2的下一个位置,看看他是否会和子串1的i位置出现公共子串。 还可以这.

一只向入研坑的程序猿 377

最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理

一.最长公共子串问题集(Longest Common Substring/LCS)     最长公共子串问题的基本表述为:     给定两个字符串,求出它们之间最长的相同子字符串的长度。     最直接的解法自然是找出两个字符串的所有子字符串进行比较看他们是否相同,然后取得相同最长的那个。对于一个长度为n的字符串,它有n(n+1)/2 个非空子串。所 以假如两个字符串的长度同为n,通

Invoker's Tower 5877

删除最大嵌套字符串的子串的优化问题

删除最大嵌套字符串的子串的优化问题 pta题库上一道简单删除子串题目: ![在这里插入代码片](https://img-blog.csdnimg.cn/20190105205520775.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3F...

qq_40761125的博客 159

字符串最大公共子序列以及最大公共子串问题

最大公共子序列 [code="java"]import java.util.Random; public class LCS { public static void main(String[] args){ //设置字符串长度 int substringLength1 = 20; int substringLength2 = ...

I'am GongQi. 205

动态规划 字符串最大公共子序列以及最大公共子串问题LCS

1、先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。 2、最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"

zjw123king的博客 570

用java实现串匹配问题_java实现字符串匹配问题之求最大公共子串

转载请注明出处:http://blog.youkuaiyun.com/xiaojimanman/article/details/38924981最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串。算法思想:基于图计算两字符串的公共子串。具体算法思想参照下图:输入字符串S1:achmacmh 输入字符串S2:macham1)第a步,是将字符串s1,...

weixin_30825389的博客 241

java中两个字符串匹配的个数_java实现字符串匹配问题之求两个字符串的最大公共子串...

转载请注明出处:http://blog.youkuaiyun.com/xiaojimanman/article/details/38924981 近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串. 算法思想:基于图计算两字符串的公共子串.详细算法思想參照下图: 输入字符串S1:achmacmh 输入字符串S2:macham 1)第a步,是将字符...

weixin_42392425的博客 499

最长回文子串问题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 题目分析 其实,这道题的解法有多种,包括暴力解法、动态规划、中心扩展法等,在这里,只讲述中心扩展法,剩下的几种办法,大家可以自行百度。中心扩展法的基...

qq_29462849的博客 3127
上一篇: 数组中只出现一次的数字
下一篇: 公共子串加全排列
runner668
博客等级 码龄11年 161粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值