最大公共字符串输出

一.华为OJ题目:

查找两个字符串a,b中的最长公共子串。

详细描述:

查找两个字符串a,b中的最长公共子串。

接口设计及说明:

 

 /*****************************************************************************

 Description  : 查找两个字符串a,b中的最长公共子串

 Input Param  : String stringA, 输入字符串A

    String stringB, 输入字符串B              

 Output Param :

 Return Value : 成功返回最大公共子串,失败返回null(如:数据错误)

 *****************************************************************************/

 public static StringiQueryMaxCommString(String stringA, String stringB)

 {

    /* 在这里实现功能,将结果填入输入数组中*/

    return null;

 }

 

二.详细解答过程:

 

1.首先,计算2个字符串的长度。定义整形变量 counts,pos_end;lengthA=strA.length()

2.然后,进入两层循环:

(1)第一层循环,用i作递增变量(0~lengthA),初始化posA,countsA;

(2)第二层循环,用j作递增变量(0~lengthB)

进入第二层循环,寻找B字符串中与str[posA]相等的字符,如果找到,那么posA++,countsA++,

接着在第二层循环内继续寻找查看字符串B中是否下一个字符仍然与A字符串中的对应字符相同,

如果又找到,那么继续让posA++,countsA++,如果中间突然出现一个不相等然后后面一个又相等了怎么办?会不会出现误差?

 

事实证明不会出现这种情况,原因是posA++的同时j也在递增,所以他们是对应相等的时候,才会进入相应的条件语句

并且posA++,countsA++

(3)第二层循环结束之后,i++,那么再重新寻找公共字符串,如果找到更大的字符串,那么countsA>counts条件语句将成立

于是进入条件语句,counts更新,posA的位置也更新。(因为posA位置递增了,所以处理之后要-1)

 

3.该步骤将最大公共字符子串从末尾添加进string类str内;

 

4.函数返回str;

 

代码:

//求最大公共字符串并输出

 

#include <iostream> 
#include <string> 
using namespace std; 
 static string iQueryMaxCommString(string&stringA, string stringB)
 {
          int cnts=0,pos_end,lenA,lenB;
          lenA=stringA.size();
          lenB=stringB.size();
          for(int i=0;i<lenA;i++)
          {
                    int posA=i;
                    int countA=0;
                     for(int j=0;j<lenB;j++)
                     {
                              if(stringA[posA]==stringB[j])
                              {
                                       countA++;
                                       ++posA;
                                       if(cnts<countA)
                                       {
                                                 cnts=countA;
                                                 pos_end=posA-1;
                                       }
                              }
                     }
          }
          string str;
          int begin=pos_end-cnts+1;
          for(int j=begin;j<=pos_end;j++)
          {
                    str.push_back(stringA[j]);
          }
          return str;
 }
 
 intmain()
 {
          string str1,str2;
          getline(cin,str1);
          getline(cin,str2);
          cout<<iQueryMaxCommString(str1,str2)<<endl;
          return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值