华为机试-公共字串计算
Posted WenJieWangFlyToWorld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试-公共字串计算相关的知识,希望对你有一定的参考价值。
题目描述
题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写
详细描述:
接口说明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
输入参数:
char * pFirstStr //第一个字符串
char * pSecondStr//第二个字符串
输入描述:
输入两个字符串
输出描述:
输出一个整数
输入例子:
asdfas werasdfaswer
输出例子:
6
效率低的Java程序实现:
- import java.util.Scanner;
- public class Main{
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Scanner sc = new Scanner(System.in);
- String str1 = "";
- String str2 = "";
- while(sc.hasNext()){
- str1 = sc.next();
- str2 = sc.next();
- System.out.println(getCommonStrLength(str1, str2));
- }
- }
- public static int getCommonStrLength(String str1, String str2){
- int len1 = str1.length();
- int len2 = str2.length();
- int[][] dp = new int[len1+1][len2+1];
- for(int i=0;i<=len1;i++){
- for(int j=0;j<=len2;j++){
- dp[i][j] = 0;
- }
- }
- for(int i=1;i<=len1;i++){
- for(int j=1;j<=len2;j++){
- if(str1.charAt(i-1) == str2.charAt(j-1)){
- dp[i][j] = dp[i-1][j-1] + 1;
- }else{
- dp[i][j] = 0; //区别在这儿
- }
- }
- }
- int max = 0;
- for(int i=0;i<=len1;i++){
- for(int j=0;j<=len2;j++){
- if(max < dp[i][j])
- max = dp[i][j];
- }
- }
- return max;
- }
- }
效率低的Java程序实现:
- import java.util.Scanner;
- /**
- * 华为机试公共字串计算
- *
- * @author LiJian 传统方法是对短的字符串从头进行遍历,选择不同的起点来进行遍历找到公共字串
- *
- * 我想的是利用字符串的contain方法来寻找字串,效率会略微高点
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- while (sc.hasNext()) {
- String pFirstStr = sc.next();
- String pSecondStr = sc.next();
- int num = pFirstStr.length() > pSecondStr.length() ? getCommonStrLength(pFirstStr, pSecondStr)
- : getCommonStrLength(pSecondStr, pFirstStr);
- System.out.println(num);
- }
- }
- private static int getCommonStrLength(String pFirstStr, String pSecondStr) {
- int start = 0;
- int end = pSecondStr.length() - 1;
- int max = 0;
- for (; start < pSecondStr.length(); start++) {
- if (max > pSecondStr.substring(start).length()) {
- break;
- }
- if (pFirstStr.contains(pSecondStr.substring(start))) {
- max = pSecondStr.substring(start).length();
- continue;
- }
- for (int j = end; j > start; j--) {
- if (j - start <= max) {
- break;
- }
- if (pFirstStr.contains(pSecondStr.substring(start, j))) {
- max = j - start;
- break;
- }
- }
- }
- return max;
- }
- }
以上是关于华为机试-公共字串计算的主要内容,如果未能解决你的问题,请参考以下文章