1. 程式人生 > >兩個字串中匹配最大字串

兩個字串中匹配最大字串

(實現一)
#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;
 }
}

相關推薦

字串匹配字串

(實現一) #include<stdio.h> void main() { int i,j,start_index; char str1[] = "abcdef"; char str2[] = "acdeg"

用指向函式的指標變數作函式的引數求整數值、小值、和

//用指向函式的指標變數作函式的引數#include <stdio.h>#include <string.h>void main(){ int max(int,int);//函式宣告 int min(int,int);//函式宣告 int add(in

字串操作】 尋找字串公共子串

*題目描述:請編寫一個函式,求2個字串的最長公共子串,n<20,字元長度不超過255.       例如有2個字串為:       Name some local bus.       local bus is high speed I/O bus close to

DP--HDU 1003求數字串連續序列(含有DP過程詳細分析)

d+ 最大 高亮 esp 序列 cas 最大連續 hdu 1003 for 題意如標題所示。測試數據規模為100000。 首先從DP的角度考慮 狀態:i(數組下標) 狀態轉移方程: 註:加上“等於零”是為了得到有多解時,的第一個解。(原諒我的字 -_-) 初始邊界狀態極

51Nod 1277 - 字串值(KMP)

【題目描述】 【思路】 假設現在有一個位置 p o s

【 PHP 】取出一個字串長度的迴文字串

取出一個字串中長度最大的迴文字串 <?php function func($str) { // 初始化最大回文序列中間座標 $maxxy = 0; // 初始化最大回文長度 $maxLength = 0; // 初始化

字串值(KMP)

【題目描述】 【思路】 假設現在有一個位置 pospospos ,其字首已經出現一次即 [0,pos−1][0,pos-1][0,pos−1] 這個字首已經出現了一次,現在考慮一下 next[pos]next[pos]next[pos] 的意義,其實就是包含

JavaScript - 寫一個純函式 - 返回字串值 和 小值

 JavaScript  - 寫一個純函式 -  返回字串中的 最大值 和 最小值 函式裡面:  兩種寫法的返回值是一樣的. 有一個是 呼叫了 隱式型別轉換 另外一個是 呼叫了 顯示型別轉換 推薦是的是用 顯示型別轉換. 這樣對於程式碼的執

字串

一個字串的字首是指包含該字元第一個字母的連續子串,例如:abcd的所有字首為a, ab, abc, abcd。給出一個字串S,求其所有字首中,字元長度與出現次數的乘積的最大值。例如:S = "abababa" 所有的字首如下:"a", 長度與出現次數的乘積 1 * 4 = 4

python--輸出字串長度重複元素

def get_list(st): ls=[] for i in range(0,len(st)): for j in range(i+1,len(st)): ls.append(st[i:j]) print(l

動態規劃系列---求陣列元素差的

題目 求陣列中兩個元素差的最大值(後面的元素減去前面的元素);對應實際生活中的股票買賣,找出可能的最大收益; 思路 類似於求陣列連續和的最大值; 儲存最大差值和最小值,遍歷陣列,如果當前元素-min>最大差值,則更新最大差值;如果當前元素<

KMP——51nod1277 字串

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277 標算Kmp啦 題目中讓我們求的前綴出現次數是可以用Kmp中的n

Python:lambda表達式實現求變量的

函數 style ret 對象 else 兩個 說明 引用 spa lambda 表達式(又稱匿名函數)   作用:     創建一個匿名函數對象     同def 類似,但不提供函數名   格式:     lambda [參數1,參數2,.....]: 表達式(默認只能寫

求10整數

求10個整數中的最大值 #include <stdio.h> #include <windows.h> int main() { int a[] = { 12, 15, 45, 78, 21, 36, 42, 69, 96, 86 }; //定義一個數組a int s

Problem E: 求三字元

Problem E: 求三個字元中的最大值 Time Limit: 1 Sec  Memory Limit: 128 MB Description 輸入3個字元,輸出其中的最大值 Input 3個字元 Output 這三個字元中的最

求十整數

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int main() { int a[10]; int i, max; printf("輸入十個數:\n"); for (i =

求十整數的數值

#include<stdio.h> #include<stdlib.h> int main(){ int arr[10] = { 10, 20, 15, 18, 19, -1, 7, 4, 3, 0 }; int max = arr[0]; in

任意輸入整數,輸出

/*  * Copyright (c) 2013, 煙臺大學計算機學院 * All rights reserved. * 作    者: 高古尊 * 完成日期:2013 年10  月11  日 * 版 本 號:v1.0 * 樣例輸入:6 9 * 樣例輸出:9 *

第7周專案:任意輸入整數,輸出

/*  * Copyright (c) 2013, 煙臺大學計算機與控制工程學院 * All rights reserved. * 作    者: 孔令璽 * 完成日期:2013年10  月  11日 * 版 本 號:v1.0 * * 問題描述:任意輸入兩個整

C#的bug---dataTable的行數限制和 Console.write的溢位錯誤

(一)DataTable的可儲存的最大行數16777216, 否則會爆出溢位錯誤 (二)Console.write的溢位錯誤 Console.Write 大約寫2G字元後就會丟擲  " System.ArgumentException: 必須首先完成 Convert