首页 > 代码库 > 华为机试-公共字串计算

华为机试-公共字串计算

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

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


输出描述:
输出一个整数

输入例子:
asdfas werasdfaswer

输出例子:
6

效率低的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.             System.out.println(getCommonStrLength(str1, str2));  
  12.         }  
  13.     }  
  14.    
  15.     public static int getCommonStrLength(String str1, String str2){  
  16.            
  17.         int len1 = str1.length();  
  18.         int len2 = str2.length();  
  19.         int[][] dp = new int[len1+1][len2+1];  
  20.            
  21.         for(int i=0;i<=len1;i++){  
  22.             for(int j=0;j<=len2;j++){  
  23.                 dp[i][j] = 0;  
  24.             }  
  25.         }  
  26.            
  27.         for(int i=1;i<=len1;i++){  
  28.             for(int j=1;j<=len2;j++){  
  29.                 if(str1.charAt(i-1) == str2.charAt(j-1)){  
  30.                     dp[i][j] = dp[i-1][j-1] + 1;  
  31.                 }else{  
  32.                     dp[i][j] = 0;   //区别在这儿          
  33.                 }  
  34.             }  
  35.         }  
  36.            
  37.         int max = 0;  
  38.         for(int i=0;i<=len1;i++){  
  39.             for(int j=0;j<=len2;j++){  
  40.                 if(max < dp[i][j])  
  41.                     max = dp[i][j];  
  42.             }  
  43.         }  
  44.            
  45.         return max;  
  46.     }  
  47. }  

 

 

效率低的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.             int num = pFirstStr.length() > pSecondStr.length() ? getCommonStrLength(pFirstStr, pSecondStr)  
  18.                     : getCommonStrLength(pSecondStr, pFirstStr);  
  19.             System.out.println(num);  
  20.   
  21.         }  
  22.   
  23.     }  
  24.   
  25.     private static int getCommonStrLength(String pFirstStr, String pSecondStr) {  
  26.         int start = 0;  
  27.         int end = pSecondStr.length() - 1;  
  28.         int max = 0;  
  29.         for (; start < pSecondStr.length(); start++) {  
  30.             if (max > pSecondStr.substring(start).length()) {  
  31.                 break;  
  32.             }  
  33.             if (pFirstStr.contains(pSecondStr.substring(start))) {  
  34.                 max = pSecondStr.substring(start).length();  
  35.                 continue;  
  36.             }  
  37.             for (int j = end; j > start; j--) {  
  38.   
  39.                 if (j - start <= max) {  
  40.                     break;  
  41.                 }  
  42.                 if (pFirstStr.contains(pSecondStr.substring(start, j))) {  
  43.   
  44.                     max = j - start;  
  45.                     break;  
  46.   
  47.                 }  
  48.             }  
  49.         }  
  50.         return max;  
  51.   
  52.     }  
  53.   
  54. }  

华为机试-公共字串计算