华为机试-公共字串计算

题目描述
题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写
详细描述:
接口说明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
输入参数:
char * pFirstStr //第一个字符串
char * pSecondStr//第二个字符串

输入描述:
输入两个字符串


输出描述:
输出一个整数

输入例子:
asdfas werasdfaswer

输出例子:
6

效率高的Java程序实现:

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <string>  
  4. #include <fstream>  
  5. #include <cstring>  
  6. #include <algorithm>  
  7. using namespace std;  
  8.   
  9. int main()  
  10. {  
  11.     char s1[512],s2[512];  
  12.     int i,j,count=0;  
  13.     int maxA=0;  
  14.     while(cin.getline(s1,512),cin.getline(s2,512))  
  15.     {  
  16.         int length1=strlen(s1);  
  17.         int length2=strlen(s2);  
  18.         int k1,k2;  
  19.         count=0;  
  20.         maxA=0;  
  21.         for(i=0; i<length1; i++)  
  22.         {  
  23.             for(j=0; j<length2; j++)  
  24.             {  
  25.                 k1=i;  
  26.                 k2=j;  
  27.                 count=0;  
  28.                 while(s1[k1]==s2[k2] && s1[k1]!='' && s2[k2]!='')  
  29.                 {  
  30.                     k1++;  
  31.                     k2++;  
  32.                     count++;  
  33.                 }  
  34.                 if(count>maxA)  
  35.                 {  
  36.                     maxA=count;  
  37.                     count=0;  
  38.                 }  
  39.             }  
  40.         }  
  41.         cout<<maxA<<endl;  
  42.     }  
  43.     return 0;  

效率高的Java程序实现(动态规划):

  1. import java.util.Scanner;  
  2. public class Main{  
  3.     public static void main(String[] args) {  
  4.         // TODO Auto-generated method stub  
  5.         Scanner sc = new Scanner(System.in);  
  6.         String str1 = "";  
  7.         String str2 = "";  
  8.         while(sc.hasNext()){  
  9.             str1 = sc.next();  
  10.             str2 = sc.next();
  11.            str1=str1.toLowerCase()  ;
  12.            str2=str2.toLowerCase();
  13.             System.out.println(getCommonStrLength(str1, str2));  
  14.         }  
  15.     }  
  16.    
  17.     public static int getCommonStrLength(String str1, String str2){  
  18.            
  19.         int len1 = str1.length();  
  20.         int len2 = str2.length();  
  21.         int[][] dp = new int[len1+1][len2+1];  
  22.            
  23.         for(int i=0;i<=len1;i++){  
  24.             for(int j=0;j<=len2;j++){  
  25.                 dp[i][j] = 0;  
  26.             }  
  27.         }  
  28.            
  29.         for(int i=1;i<=len1;i++){  
  30.             for(int j=1;j<=len2;j++){  
  31.                 if(str1.charAt(i-1) == str2.charAt(j-1)){  
  32.                     dp[i][j] = dp[i-1][j-1] + 1;  
  33.                 }else{  
  34.                     dp[i][j] = 0;   //区别在这儿          
  35.                 }  
  36.             }  
  37.         }  
  38.            
  39.         int max = 0;  
  40.         for(int i=0;i<=len1;i++){  
  41.             for(int j=0;j<=len2;j++){  
  42.                 if(max < dp[i][j])  
  43.                     max = dp[i][j];  
  44.             }  
  45.         }  
  46.            
  47.         return max;  
  48.     }  
  49. }  

效率低的Java程序实现:

  1. import java.util.Scanner;  
  2.   
  3. /** 
  4.  * 华为机试公共字串计算 
  5.  *  
  6.  * @author LiJian 传统方法是对短的字符串从头进行遍历,选择不同的起点来进行遍历找到公共字串 
  7.  * 
  8.  *         我想的是利用字符串的contain方法来寻找字串,效率会略微高点 
  9.  */  
  10. public class Main {  
  11.     public static void main(String[] args) {  
  12.         Scanner sc = new Scanner(System.in);  
  13.   
  14.         while (sc.hasNext()) {  
  15.             String pFirstStr = sc.next();  
  16.             String pSecondStr = sc.next();  
  17.             pFirstStr=pFirstStr.toLowerCase();
  18.             pSecondStr=pSecondStr.toLowerCase();
  19.             int num = pFirstStr.length() > pSecondStr.length() ? getCommonStrLength(pFirstStr, pSecondStr)  
  20.                     : getCommonStrLength(pSecondStr, pFirstStr);  
  21.             System.out.println(num);  
  22.   
  23.         }  
  24.   
  25.     }  
  26.   
  27.     private static int getCommonStrLength(String pFirstStr, String pSecondStr) {  
  28.         int start = 0;  
  29.         int end = pSecondStr.length() - 1;  
  30.         int max = 0;  
  31.         for (; start < pSecondStr.length(); start++) {  
  32.             if (max > pSecondStr.substring(start).length()) {  
  33.                 break;  
  34.             }  
  35.             if (pFirstStr.contains(pSecondStr.substring(start))) {  
  36.                 max = pSecondStr.substring(start).length();  
  37.                 continue;  
  38.             }  
  39.             for (int j = end; j > start; j--) {  
  40.   
  41.                 if (j - start <= max) {  
  42.                     break;  
  43.                 }  
  44.                 if (pFirstStr.contains(pSecondStr.substring(start, j))) {  
  45.   
  46.                     max = j - start;  
  47.                     break;  
  48.   
  49.                 }  
  50.             }  
  51.         }  
  52.         return max;  
  53.   
  54.     }  
  55.   
  56. }  
原文地址:https://www.cnblogs.com/wwjldm/p/7096086.html