1.原题是求出最大公共子串的个数就可以

原理:利用二维矩阵排列的方式。将俩字符串进行比較

#include <iostream>
#include <vector>
using namespace std; int prcs_2Strs(const char* s1,const char* s2)
{
int maxSameLength = 0;
int L1 = strlen(s1);
int L2 = strlen(s2);
if(L1==0 || L2==0) //推断字符串是否为空?
return 0; int **c = new int*[L1+1]; //创建矩阵,保存S1与S2各元素比較的结果
for(int i = 0; i < L1+1; i++)
c[i] = new int[L2+1];
for(int i = 0; i < L1+1; i++) //矩阵初始化为0
{
for(int j = 0; j < L2+1; j++)
{ c[i][j]=0; }
}
for(int m =0;m<L1;m++)
{
for(int n=0;n<L2;n++)
{
if(s1[m]==s2[n]) //開始比較
{
//统计比較结果在矩阵 C 中
if((m==0||n==0)) //第一行或者第一列,C[m][n]没有左上角元素,则把它自己置为1
c[m][n]=1;
else
c[m][n]=c[m-1][n-1]+1; //在左上角元素基础上加上1
}
}
}
for(int i = 0; i < L1+1; i++) //找出最大值,赋给maxSameLength
{
for(int j = 0; j < L2+1; j++)
{
if(c[i][j]>maxSameLength)
maxSameLength = c[i][j];
}
}
return maxSameLength;
} int main()
{
char s1[30],s2[30];
cout<<"输入俩字符串:";
cin.getline(s1,30);
cin.getline(s2,30);
cout<<"最大公共子串元素数量为:"<<prcs_2Strs(s1,s2)<<endl;
return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

2. 统计个数并输出元素

我的思路是将个数和位置存入到一个Vector中。然后输出

#include <iostream>
#include <vector>
using namespace std; vector<int> prcs_2Strs(const char* s1,const char* s2)
{
vector<int> pos;
int maxSameLength = 0;
int L1 = strlen(s1);
int L2 = strlen(s2);
if(L1==0 || L2==0) //推断字符串是否为空
return pos; int **c = new int*[L1+1]; //创建矩阵,保存S1与S2各元素比較的结果
for(int i = 0; i < L1+1; i++)
c[i] = new int[L2+1];
for(int i = 0; i < L1+1; i++) //矩阵初始化为0
{
for(int j = 0; j < L2+1; j++)
{ c[i][j]=0; }
} for(int m =0;m<L1;m++)
{
for(int n=0;n<L2;n++)
{
if(s1[m]==s2[n]) //開始比較
{
//统计比較结果在矩阵 C 中
if((m==0||n==0)) //第一行或者第一列,C[m][n]没有左上角元素,则把它自己置为1
c[m][n]=1;
else
c[m][n]=c[m-1][n-1]+1; //在左上角元素基础上加上1
}
}
}
for(int i = 0; i < L1+1; i++) //找出最大值,赋给maxSameLength
{
for(int j = 0; j < L2+1; j++)
{
if(c[i][j]>maxSameLength)
maxSameLength = c[i][j];
}
}
pos.push_back(maxSameLength); for(int i = 0; i < L1+1; i++) //找出最大值的位置
{
for(int j = 0; j < L2+1; j++)
{
if(c[i][j]==maxSameLength)
pos.push_back(i);
}
}
return pos; //终于pos中记录了最大公共子串的长度和在S1中位置
} int main()
{
char s1[30],s2[30];
cout<<"输入俩字符串:";
cin.getline(s1,30);
cin.getline(s2,30);
vector<int> results = prcs_2Strs(s1,s2);
int num = results[0];
int posEnd = results[1];
if(num>0)
{
cout<<"最大公共子串元素数量为:"<<num<<endl;
cout<<"最大公共子串元素:";
for(int a=1;a<=num;a++)
cout<<s1[posEnd-num+a];
}
return 0;
}

【华为OJ平台练习题】求最大公共子串的个数和元素的更多相关文章

  1. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  2. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  3. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  4. 华为OJ平台——求最大连续bit数

    题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: ...

  5. 华为OJ平台——超长正整数相加

    题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999 ...

  6. 华为OJ平台——DNA序列

    题目描述: 一个DNA序列由A/C/G/T四个字母的排列组合组成.G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度).在基因工程中,这个比例非 ...

  7. 华为OJ平台——整数的二进制中1的个数

    题目描述: 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 思路: 这是一道很基本的考查位运算的面试题.包括微软在内的很多公司都曾采用 ...

  8. 华为OJ平台——杨辉三角的变形

    import java.util.Scanner; /** * 杨辉三角的变形 *第一行为1,后面每一行的一个数是其左上角到右上角的数的和,没有的记为0 * 1 * 1 1 1 * 1 2 3 2 1 ...

  9. 华为OJ平台——密码强度等级

    题目描述: 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分. 一.密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二.字母: 0  ...

随机推荐

  1. javascript中switch的用法注意

    switch中文翻译过来是转换.切换的意思.用在js中,各个条件转换而执行不同代码.

  2. python lambda简单介绍

    python lambda 在python中,如果想要创建函数需要使用关键字def,而如果想要创建匿名函数,就需要使用lambda. lambda创建的函数和def创建的函数有什么区别? def创建的 ...

  3. C# 集合类-使用

    关联性集合类 关联性集合类即我们常说的键值对集合,允许我们通过Key来访问和维护集合. 我们来看一下  .net 为我们提供了哪些泛型的关联性集合类: Dictionary<TKey,TValu ...

  4. 阿里云腾讯云服务器ubuntu多域名配置

    1.将域名A记录解析到服务器的公网 IP 地址,把www也添加A记录到公网ip 2.ubuntu系统修改hosts文件,hosts文件目录为/etc/hosts,可以用vim编辑  sudo vim ...

  5. [BZOJ1758][WC2010]重建计划(点分治+单调队列)

    点分治,对于每个分治中心,考虑求出经过它的符合长度条件的链的最大权值和. 从分治中心dfs下去取出所有链,为了防止两条链属于同一个子树,我们一个子树一个子树地处理. 用s1[i]记录目前分治中心伸下去 ...

  6. 【拉格朗日插值法】【找规律】【高精度】Gym - 101156G - Non-Attacking Queens

    题意:问你n*n的国际象棋棋盘上放3个互不攻击皇后的方案数. oeis……公式见代码内 //a(n) = 5a(n - 1) - 8a(n - 2) + 14a(n - 4) - 14a(n - 5) ...

  7. OD基本汇编指令

    jmp ;无条件跳转 指哪飞哪 一些杂志中说的直飞光明顶,指的就是它了~ 光明顶一般指爆破地址根据条件跳转的指令:JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转   JNZ ;不为 ...

  8. 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】

    Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...

  9. tsinsen A1067. Fibonacci数列整除问题 dp

    A1067. Fibonacci数列整除问题 时间限制:1.0s   内存限制:512.0MB   总提交次数:2796   AC次数:496   平均分:51.83 将本题分享到:     查看未格 ...

  10. Null 和 Undefined

    在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...