两个字符串中匹配最大字符串

(实现一)
#include<stdio.h>

  void   main()   
  {   
    int   i,j,start_index;
    char str1[] = "abcdef";
    char str2[] = "acdeg"; 
    char   result[10] ={0};
    int   count   =0;   
    int   tmp_count=0   
    for(i=0;i<strlen(str1);i++)
    {   
      for(j=0,tmp_count=0;str1[i]==str2[j]&&j<strlen(str2);j++,tmp_count++);   
        if(j<strlen(str2)&&tmp_count>count)   
        {   
          count   =   tmp_count;   
          start_index   =   i;   
        }   
      }   
    strncpy(result,str1+start_index,count);  
    printf(result); 
  } 


(实现二)

给出两个字符串,用自己最熟悉的编程语言找出两个字符串中匹配最长的字符串。如:“ascdefd”和“mntrcdefpk”则匹配出的最大字符串为:cdef。

package com.stringSub;

public class SubString {


public static void main(String[] args) {
/*
* 使用线程,可以启用两个线程进行匹配,一个是从头开始,一个从尾部开始,for循环的界限当然就是中间啦。
* */
//GetStringThread thread = new GetStringThread("pm","mncdepk");
//thread.start();

SubString sub = new SubString();
String maxStr = sub.SubStr("cdepk", "mncdepk");
System.out.println(maxStr);
}

public String SubStr(String str1,String str2){

//使用最短的字符串去分割,可以实现效率更优。
String bigStr = str1.length() > str2.length() ? str1 : str2;
String smaStr = str1.length() > str2.length() ? str2 : str1;
String maxStr = "";

//对短的字符串先进行逐个分割。
for (int i = 0; i < smaStr.length(); i++) {
String temp = smaStr.substring(i, i + 1);
if (bigStr.indexOf(temp) != -1) {//如果第一个字符匹配上,则开始往后匹配。
String temTest = smaStr.substring(i, smaStr.length());
if (maxStr.length() < temp.length())
maxStr = temp;
int k = 1;
while (k < temTest.length()) {
k++;
String strT = temTest.substring(0, k);
//如果出现匹配不上了,说明增加最后一个字符之后就匹配不上了,那么增加最后一个之前都还能匹配。
if (bigStr.indexOf(strT) == -1) {
maxStr = strT.substring(0, k - 1);
break;
} else if (k == temTest.length()) {
/*
* 如果匹配到最后没有字符串了还是能匹配上,说明从开始进入循环到最后一个字符都能匹配。
* 其实在这里还可以优化一下程序。就是程序匹配到最后一个字符串了,那么外层的for循环就没必要再做了。
* */
if (bigStr.indexOf(temTest) != -1) {
if (maxStr.length() < temTest.length())
maxStr = temTest;
}
}
}
}
}
return maxStr;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值