1. 程式人生 > >求兩個陣列的公共子陣列的最大長度

求兩個陣列的公共子陣列的最大長度

已知兩個整數陣列A,B。比如A=[2,2,2,3,3,1,5,0]  B=[2,3,6,5,2,3,9],我們定義子陣列為某一個數組裡面的連續的一個或多個數組成的陣列。

比如[2,3]既是A又是B的子陣列,但[6,5]只是B的子陣列,不是A的,[2,3]是A,B的公共子陣列。

要求:寫一個函式 int f(A,B),返回任意兩個陣列的最長公共子陣列的長度(元素個數),在上面的例子中要返回2。

注意:1)不能增加額外的陣列或其他儲存;只能使用若干個變數;不能使用長字串

             2)請以保證正確為優先考慮;可以不用考慮是否是最優先的演算法

int f(int[] A, int[] B) {
int curIndexLength = 0;
int endIndexLength = 0;
for (int i = 1; i < A.length; i++) {
for (int j = 0; j + i <= A.length; j++) {
int start = j;
int end = start + i;
for (int n = 0; n < B.length; n++) {
if (A[start] == B[n]) {
if ((end - start) <= (B.length - n)) {
int tmp_m = start;
int tmp_n = n;
while (tmp_m < end) {
if (A[tmp_m] != B[tmp_n])
break;
tmp_m++;
tmp_n++;
}
if (tmp_m == end){
curIndexLength = end - start;
if (curIndexLength > endIndexLength)
endIndexLength = curIndexLength;
}
}
}
}
}
}
return endIndexLength;
}

相關推薦

java字元A和B的相同字串

private static ArrayList getMaxSubString(String s1,String s2){ //最大相同子串,s1,s2=min String max=(s1.length()>s2.length())?s1:s2; String min=(m

字符串的公共串——Java實現

求解 ont ins oid info ++ 題意 短字符串 clas 要求:求兩個字符串的最長公共子串,如“abcdefg”和“adefgwgeweg”的最長公共子串為“defg”(子串必須是連續的) public class Main03{ // 求解兩個字符號的最

等長有序陣列的中位數的logN演算法 分治法

http://blog.csdn.net/yangliuy/article/details/7194199 題目:有兩個長為n的非遞減陣列A和B,把B接在A的後面變成長為2n的陣列C。設計演算法求C的中位數(第n小數)。 思路:O(n)的演算法很容易找到,關鍵是用二

Leetcode421. 找出陣列元素異或的

Leetcode421. Maximum XOR of Two Numbers in an Array 題目 Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai

已排序的陣列中所有元素的第K(小)

1.reference 2.解題思路 以下均假設A[0…m-1],B[0…n-1]; 1)O(n) 假設A,B均以降序排列,宣告兩個指標p,q。p指向A[0], q指向B[0]。再來一個count=0,用來表示當前已經到第count大了。然後指標

有序整型陣列的交集

1. 問題描述   有兩個有序的整型陣列a和b(沒有重複元素),他們的長度分別為lenA和lenB,求出他們的共同元素。   例如:a = 0,1,3,5,7,9,11;b = 2,3,4,7,11;   它們的交集為{3,7,11}。 2. 方法思

核心API的使用(獲取字符串的相同串)

ins for system bst span sam sub string 三目運算 /** * 獲取兩個字符串的最大相同子串。 例:abegad acegab */public class TheSameString { public static void main(

11572 - Unique Snowflakes(貪心,指針滑動保存長度

fort ould inf inpu 問題 ica 兩指針 rst std Emily the entrepreneur has a cool business idea: packaging and selling snow?akes. She has devised

找出int型變數的值和小值,不使用if/:?/switch判斷語句

方法一: Max=(a+b+|a-b|)/2; Max=(a+b-|a-b|)/2; 方法二:通過加減運算和移位運算相結合 Min = a+(((b-a)>>31)&(b-a)); Max = a-(((a-b)>>31)&(a-b

用字尾陣列字串的公共

對於兩個字串,不好直接運用字尾陣列,所以我們可以把兩個子串串中間用一個在字串中不會出現的字元連線起 來,比如'$‘,計算字尾陣列,檢查字尾陣列中所有相鄰字尾。分屬於兩個字串的字尾的lcp的最大值就是答案。 因為字串的任何一個子串都是這個字串某個字尾的字首。求A和B 的最長公

陣列公共陣列長度

已知兩個整數陣列A,B。比如A=[2,2,2,3,3,1,5,0]  B=[2,3,6,5,2,3,9],我們定義子陣列為某一個數組裡面的連續的一個或多個數組成的陣列。 比如[2,3]既是A又是B的子陣列,但[6,5]只是B的子陣列,不是A的,[2,3]是A,B的公共子陣列

字符串的公共串的長度

max clu name ++ algorithm 字符串 har ret namespace 1 #include <iostream> 2 #include <string.h> 3 #include <algorithm>

串的公共序列的長度

notes col length body 子字符串 使用遞歸 seq ons commons 1 public class CommonSubsequence { 2 3 public static int f(String s1,String s2){

公共字串的公共串(C++)

思路: 1.按兩字串長度,兩層迴圈 2.每一次迴圈找出潛在的公共字串 (比較笨的方法,但比較好用,也很清楚,程式碼如下) #include<iostream> #include<stdio.h> #include<algorithm>

《程式設計師程式碼面試指南》字串公共

/** * 題目: * 給定兩個字串 str1 和 str2,返回兩個字串的最長公共子串。 *舉例: * str1 = "1AB2345CD",str2 = "12345EF",返回"2345"。 */ /** * 解答: * 經典動態規劃的方法可以做到時間複

python實現:字串的公共

假設s1 = 'abcdef'  ,s2 = 'mcdea',建立一個(len(s1)+1) x (len(s2)+1)的陣列,如下如所示的一個二維陣列,程式碼的操作流程是: # -*- coding

不等長、有序陣列a和b的中位數的優解(排除法 )

求兩個排序陣列A和B的中位數 最優解 O(log (m+n)) 不斷刪除個 k/2個數,然後 k = k/2 不斷刪掉陣列中肯定不是第k小的那些數字,從而能夠不斷地減小陣列,在這個過程中,我們要找的那個數字的序號(k)也會不斷地減小。 陣列中的哪些數字可以刪除

問題描述:字串str1、str2的公共序列。

首先明白兩個區別: 1、最長公共子串:子串是串的一個連續的部分,在原字串中位置是連續的 2、最長公共子序:不改變序列的順序,從序列中去掉任意的元素而獲得新的序列,也就是說子序在原字串中位置可以不連續。 遞推方程: 步驟:1序列str1和序列str2   ·長度分別為m和

java實現字串匹配問題之字串的公共

轉載請註明出處:http://blog.csdn.net/xiaojimanman/article/details/38924981 最近在專案工作中有一個關於文字對比的需求,經過這段時間的學習,總結了這篇部落格內容:求兩個字串的最大公共子串。 演算法思想:基於圖計算兩字串

序列的公共序列的長度(遞迴解法)

本題主要採用的是遞迴思想(分類討論) 判斷當前兩個字串是否有一個長度為0,若有則直接返回0即可 判斷當前兩個字串中的第一位是否相同,若相同則直接雙方去掉第一位並返回呼叫該方法(引數為兩方截斷首位的字