最长公共子串计算C++

article/2025/9/20 13:09:55

公共字串计算(最长公共子串/序列)C++

描述

题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写

输入

输入两个字符串

输出

输出一个整数

样例输入

asdfas werasdfaswer

样例输出

6

思路

暴力求解
此题用cin即可

代码

#include <iostream>
#include <string>
using namespace std;
int Maxsubstr(string a,string b)
{unsigned int start1,start2;int count=0,Max=0;for(unsigned int i=0; a[i]!='\0'; i++){for(unsigned int j=0; b[j]!='\0'; j++){start1=i;start2=j;while(a[start1]==b[start2] && start1<a.length() && start2<b.length()){start1++;start2++;count++;}if(count>Max){Max=count;}count=0;}}return Max;
}int main()
{string str1,str2;cin>>str1;cin>>str2;//不区分大小写for (unsigned int i=0; i<str1.length(); i++){str1[i]=tolower(str1[i]);}for (unsigned int i=0; i<str2.length(); i++){str2[i]=tolower(str2[i]);}cout<<Maxsubstr(str1,str2)<<endl;
}

这里写图片描述

题目

描述

查找两个字符串a,b中的最长公共子串。
详细描述:
查找两个字符串a,b中的最长公共子串。

输入

输入两个字符串

输出

返回重复出现的字符

样例输入

abcdefghijklmnop
abcsafjklmnopqrstuvw

样例输出

jklmnop

思路

暴力求解

代码

#include <iostream>
#include <string>
using namespace std;
int Maxsubstr(string a,string b,string *&s)
{unsigned int start,start1,start2;int count=0,Max=0;for(unsigned int i=0; a[i]!='\0'; i++){for(unsigned int j=0; b[j]!='\0'; j++){start1=i;start2=j;while(a[start1]==b[start2] && start1<a.length() && start2<b.length()){start1++;start2++;count++;}if(count>Max){start = i;Max = count;}count=0;}}//保存字符串s=new string[Max+1];for(int i=0; i<Max; i++){s[i]=a[i+start];}s[Max]='\0';return Max;
}int main()
{string str1,str2,*str;    cin>>str1>>str2;//此题输入-------------//getline(cin,str1);//getline(cin,str2);int length = Maxsubstr(str1,str2,str);for(int i=0; i<length; i++){cout<<str[i];}cout<<endl;return 0;
}
这里写图片描述
这里写图片描述

如果你看到这里觉得暴力方法low

Low。。。。

哎,那就聊聊动态规划版的经典问题《最长公共子串(序列)》

子串是连续的,子序列可以是不连续的。

状态转移方程:

符号约定,C1是S1的最右侧字符,C2是S2的最右侧字符,S1‘是从S1中去除C1的部分,S2’是从S2中去除C2的部分。

LCS(S1,S2)等于下列3项的最大者:

(1)LCS(S1,S2

(2)LCS(S1,S2)

(3)LCS(S1)+C1 —如果C1等于C2;

边界终止条件:如果S1和S2都是空串,则结果也是空串。

下面我们同样要构建一个矩阵来存储动态规划过程中子问题的解。这个矩阵中的每个数字代表了该行和该列之前的LCS的长度。与上面刚刚分析出的状态转移议程相对应,矩阵中每个格子里的数字应该这么填,它等于以下3项的最大值:

(1)上面一个格子里的数字

(2)左边一个格子里的数字

(3)左上角那个格子里的数字(如果 C1不等于C2); 左上角那个格子里的数字+1( 如果C1等于C2)

#include<iostream>
#include<cstring>
#include <vector>using namespace std;void SubSequence(vector<vector<string>> &flag,string str1, string str2,int i,int j);
void display(int *result,string str1,string str2);void initialVector(vector<vector<string>> &vectorAll,int len)
{for(int i=0; i<len; ++i){vector<string> temp;vectorAll.push_back(temp);}
}int lcs_string(string str1, string str2)
{int len1 = str1.length();int len2 = str2.length();int result = 0;     //记录最长公共子串长度int c[len1+1][len2+1] ;int endPos = -1;for (int i = 0; i <= len1; i++){for( int j = 0; j <= len2; j++){if(i == 0 || j == 0){c[i][j] = 0;}else if (str1.at(i-1) == str2.at(j-1)){c[i][j] = c[i-1][j-1] + 1;result = max(c[i][j], result);if(result==c[i][j])  endPos = i;//记录最后一个点的位置}else{c[i][j] = 0;//重新计数}}}//print resultstring str="";if(endPos<=len1){str = str1.substr(endPos-result,result);}else{str = str2.substr(endPos-result,result);}cout<<"\n\nLongest Common Substring : "<<str<<endl;return result;
}
//对于最长公共子序列,只是在最后一个else里面放的是前两步的最大值
int lcs_squence(string str1, string str2)
{int len1 = str1.length();int len2 = str2.length();int c[len1+1][len2+1];vector<vector<string>> flag;initialVector(flag,len1+1);for (int i = 0; i <= len1; i++){for( int j = 0; j <= len2; j++){if(i == 0 || j == 0){c[i][j] = 0;flag[i].push_back("NULL");}else if (str1.at(i-1) == str2.at(j-1)){c[i][j] = c[i-1][j-1] + 1;flag[i].push_back("left_up");}else if(c[i - 1][j]>=c[i][j - 1]){c[i][j]=c[i - 1][j];flag[i].push_back("left");}else{c[i][j] = c[i][j - 1];flag[i].push_back("up") ;}}}//display(&c[0][0],str1,str2);  //输出数组SubSequence(flag,str1,str2,str1.length(),str2.length());//cout<<c[len1][len2]<<endl;return c[len1][len2];
}void display(int *result,string str1,string str2)
{int len1 = str1.length();int len2 = str2.length();//输出表头for(int i=0; i<=len2; ++i){cout<<"\t"<<str2[i];}cout<<endl;//输出数组for(int i=0; i<=len1; ++i){cout<<str1[i]<<"\t";for(int j=0; j<=len2; ++j){cout<<*result<<"\t";result++;}cout<<endl;}}
//按照方向查找
void SubSequence(vector<vector<string>> &flag,string str1, string str2,int i,int j)
{if (i == 0 || j == 0)return;if (flag.at(i).at(j) == "left_up"){cout<<str2[j - 1]<<" ("<< i - 1<<" , "<< j - 1<<")"<<endl;//左前方SubSequence(flag,str1,str2,i - 1, j - 1);}else{if (flag.at(i).at(j) == "up"){SubSequence(flag,str1,str2,i, j - 1);}else{SubSequence(flag,str1,str2,i - 1, j);}}
}int main()
{string X = "";string Y = "";//输入getline(cin,X);getline(cin,Y);cout<<"\nFirst string:\n"<<X<<endl;cout<<"\nSecond string:\n"<<Y<<endl;cout << "Length of Longest Common Substring is " << lcs_string(X, Y)<<endl;cout << "Length of Longest Common Subsequence is " << lcs_squence(X, Y)<<endl;return 0;
}

这里写图片描述

参考引用

传送门 : 最长公共子序列

传送门 : 最长公共子序列(LCS)C++实现

传送门 : 最长公共子序列与最长公共子串

传送门 : 最长公共子序列。。

传送门 : 最长公共子序列。。大杂烩


http://chatgpt.dhexx.cn/article/EEQCYxDS.shtml

相关文章

python实现最长公共子串

介绍 子串和子序列的意思不一样&#xff0c;如下图所示&#xff0c;子序列不要求连续&#xff0c;只需要在给定序列中出现过&#xff0c;并且相对顺序一致。而子串需要连续。 图片来自动态规划 最长公共子序列 过程图解 最长公共子串&#xff1a; 同时出现在两个字符串中的最…

Leetcode——最长公共子序列 / 最长公共子串

1. 最长公共子序列 &#xff08;1&#xff09;DFS暴搜&#xff08;超时&#xff09; class Solution{public static int longestCommonSubsequence(String text1, String text2) {char[] t1Chars text1.toCharArray();char[] t2Chars text2.toCharArray();return process(t1…

C语言----最长公共子串(动态规划)

定义dp[i][j]表示字符串str1中第i个字符和str2种第j个字符为最后一个元素所构成的最长公共子串。如果要求dp[i][j]&#xff0c;也就是str1的第i个字符和str2的第j个字符为最后一个元素所构成的最长公共子串&#xff0c;我们首先需要判断这两个字符是否相等。 如果不相等&#x…

最长公共子串

最长公共子串 原题链接&#xff1a;https://www.lintcode.com/problem/79 题目 给出两个字符串&#xff0c;找到最长公共子串&#xff0c;并返回其长度。 子串的字符应该连续的出现在原字符串中&#xff0c;这与子序列有所不同。 样例 样例 1&#xff1a; 输入&#xff1a…

动态规划——最长公共子串,没有比这更通俗易懂的了

前言 动态规划是大厂的热门考点&#xff0c;其中最长公共子串与最长公共子序列这两道题出现得尤其频繁&#xff0c;这两道题其实有挺多变种&#xff0c;很适合考察侯选人对动态规划的掌握情况&#xff0c;今天我们就先来看看如何求解最长公共子串&#xff0c;图文并茂&#xff…

SQL中字符串拼接方法(MySQL,SQLServer)

1 SQLServer &#xff08;1&#xff09;用号实现字符串拼接 select 123456; &#xff08;2&#xff09;用concat()内置函数实现字符串拼接 注&#xff1a;SQLServer 2012及更高版本才支持conconcat()函数。 select concat(123,456);//两个字符串拼接 2 MySQL &#xff0…

mysql 使用group by分组后对某个字段值拼接成字符串方法,一般人都不知道!

只需要使用GROUP_CONCAT函数可以在使用groupby分组后&#xff0c;将某个字段的值进行拼接合并 使用示例&#xff1a; 数据表&#xff1a;testTb 使用 GROUP_CONCAT函数来实现&#xff0c;我们的sql可以这样写 Select albumId,GROUP_CONCAT(name) from testTb group by albumI…

MySql查询结果拼接成字符串

背景&#xff1a;做SQL查询时会经常需要&#xff0c;把查询的结果拼接成一个字符串。 解决方法&#xff1a; 通过 group_concat 函数 1.正常查询 如下: select id result from ctp_enum_item limit 100; 2.拼接结果 如下 select group_concat("",id,"") r…

MySQL 字符串拼接

在Mysql 数据库中存在两种字符串连接操作.具体操作如下 一. 语法: 1. CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 例1: 例2: 2. CONCAT_WS(separator,str1,str2,...) 说明 : …

MySQL字符串合并

MySQL有几种合并字符串的方式&#xff0c;下面来介绍一下 CONCAT函数 concat(str1, str2,...) 返回结果为连接参数产生的字符串&#xff0c;如果有任何一个参数为null&#xff0c;则返回值为null。 mysql> select concat(www,MySQL,substringIndex,com) ----------------…

mysql concat字符串拼接函数使用

目录 1、concat 2、concat_ws 3、group_concat 1、concat select CONCAT(h,e,llo) from dual; 2、concat_ws 指定分隔符进行字符串的拼接 select CONCAT_WS(_,h,e,llo) from dual;3、group_concat 用法&#xff1a; group_concat( [distinct] {要连接的字段}[order by …

MySQL如何分组拼接字符串?

上一篇文章 跨表更新&#xff0c;看到自己写的SQL像个憨憨 写了关于跨表个更新的内容。一年过的很快&#xff0c;文中后来的两位员工 馮大 和 馮二 也要面对无情的 KPI 考核了&#xff0c;他们工作干的很不错&#xff0c;performance 分别是 4 和 5 新需求来了&#xff0c;静悄…

MySQL字符串拼接函数

MySQL字符串拼接函数有以下三个&#xff1a; CONCATCONCAT_WSGROUP_CONCAT 1.CONCAT 说明 对指定字符进行拼接 语法 CONCAT(str1,str2,...) 语法说明&#xff1a; CONCAT(字符1,字符2,...) 实例 SELECT CONCAT(this ,is ,a ,demo) AS result FROM DUAL2.CONCAT_WS 说明 …

mysql 实现字符串的拼接

在Mysql 数据库中存在两种字符串连接操作.具体操作如下 一. 语法: 1. CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 例1: 例2: 2. CONCAT_WS(separator,str1,str2,...) 说明 :…

MySQL 字符串拼接 - 多种字符串拼接实战案例

本文首发&#xff1a;MySQL 字符串拼接 - 多种字符串拼接实战案例 - 卡拉云 MySQL 字符串拼接可以使多个字段的值组成一个集合&#xff0c;不仅可以拼接字符串与字符串、空格、特殊符号甚至可以拼接中文文本&#xff0c;方便我们在不同场景下应用。 本教详细讲解 CONCAT() 和…

MySQL字符串拼接的两种方式

第一种&#xff1a; MySQL自带语法Concat(string1,string2,string3...)&#xff0c;此处是直接把string1和string2等等的字符串拼接起来&#xff08;无缝拼接哦&#xff09; 说明&#xff1a;此方法在拼接的时候如果有一个值为NULL&#xff0c;则返回NULL select concat(&qu…

MySQL字符串拼接(函数)

最近帮助处理数据,需要批量更新数据,遂上网查了查方法,在此记录一下。我的原始数据如下: 一.CONCAT()函数 说明 : CONCAT(string1,string2,string3...)&#xff0c;此处是直接把string1、string2和string3等等的字符串无缝拼接起来&#xff0c;返回结果为连接参数产生的字符…

MYSql-字符串拼接

一、MySQL自带字符串拼接函数 CONCAT 字符串拼接CONCAT_WS 指定字符串分割拼接字符串拼接 ① 语法&#xff1a;CONCAT(str1,str2…) 解释&#xff1a;concat 拼接 str1和str2字符串, 省略号....代表可以多个字符串拼接 示例&#xff1a; SELECT CONCAT("hello&quo…

MySQL字符串拼接concat()、分组拼接字符串group_concat()

MySQL拼接 一、经典拼接concat(x,x,....)二、分隔符拼接CONCAT_WS(separator,str1,str2,...)三、分组拼接GROUP_CONCAT(expr) 一、经典拼接concat(x,x,....) 用法案例&#xff1a; SELECTconcat( 字符串, 拼接, &#xff0c;啥都可以, 嘿嘿 ) AS concats FROM DUAL注意&…

SQL 拼接字符串

不同的数据库&#xff0c;相应的字符串拼接方式不同&#xff0c;下面进行详细讲解。 一、MySQL字符串拼接 1、CONCAT函数 语法格式&#xff1a;CONCAT(char c1, char c2, …, char cn) &#xff0c;其中char代表字符串&#xff0c;定长与不定长均可以 连接两个字符串 sele…