zoukankan      html  css  js  c++  java
  • 华为机试-公共字串计算

    题目描述
    题目标题:
    计算两个字符串的最大公共字串的长度,字符不区分大小写
    详细描述:
    接口说明
    原型:
    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. }  
  • 相关阅读:
    《Eclipse中的一些快捷键》
    《Java中的抽象类及抽象类的作用》
    《Java中的不可变类》
    《final修饰基本类型变量和引用类型变量的区别》
    《类成员案例》
    《Java中的单例模式--两种》
    《Java中的自动装箱和拆箱功能.》
    Chrome 经典插件
    Sublimeの虚拟环境(Venv)设置
    HTTP下午茶
  • 原文地址:https://www.cnblogs.com/wwjldm/p/7096086.html
Copyright © 2011-2022 走看看