2012-02-17 14 views
4

我想找出一個字符串有單個不匹配。
字符串不匹配由單個字母

1)CHARACTER INTERCHANGE W/O DISTURBING PATTERN 
ACRPG0182F v/s ACRPG0812F 
ACNPA4428K v/s ACHPA4428K 

2)CHARACTER LENGTH DIFFERS BY 1 DIGIT 
ACRPG0182F v/s ACRPG0812 
ACRPG0182F v/s CRPG0812F 

在情況1中兩個字符串的長度是相同的,但它有1個字符不匹配
在情況2中兩個字符串的長度相差1和任意一個字符可以在兩個字符串不匹配。

+0

有關這些字符串的預期長度的任何信息? – hovanessyan 2012-02-17 13:52:03

+0

在案件1兩個字符串的長度相同,並在案件2字符串相差1個字母 – Abhij 2012-02-17 13:57:38

+0

我的意思是,如果你不希望算法,將在30000字符串的工作足夠快,你可以去直接和簡單的解決方案(iter所有的方式所有字符串)。 – hovanessyan 2012-02-17 14:00:15

回答

4
  • 使用正則表達式得到數(\d+
  • 填補所有字符(numberStr.toCharArray()
  • 使用guavaSets一個Set - Sets.difference(set1, set2),看看它是否有一個元素

本來我認爲您需要以不同的方式檢查差異:是否只有一個數字是不同的,而不是「該字符串只包含一個不同的數字,而不考慮順序」。如果順序也很重要,只是計算levenshtein distance,看它是否等於1

StringUtils.getLevenshteinDistance(s1, s2)commons-lang將做到這一點。

+0

如果你應用這個[link](http://www.merriampark.com/ld.htm)問題的例子,你會得到2的距離。不確定這足以滿足需求。 – foch 2012-02-17 14:09:30

+0

你甚至會得到3.這就是爲什麼我添加Sets.difference解決方案 – Bozho 2012-02-17 14:10:02

0

定義字符串的異或函數。

0

這聽起來像是1Levenshtein distance,請看鏈接中的算法。

+0

,因爲我更多地看他的例子,這是行不通的。當我更深入地看他的例子時,他需要一個不同的邏輯 – Bozho 2012-02-17 13:57:11

2

正如Bozho所說,使用levenstein distance可能是解決您的問題的最直接途徑。該頁面的定義看起來正是你所要求的。

Levenshtein距離(LD)是二 串,我們將稱之爲源串(一個或多個)和 目標串(T)之間的相似性的量度。距離是刪除數, 插入或將s轉換爲t所需的替換。

+0

,這是行不通的。他需要一個不同的邏輯 – Bozho 2012-02-17 13:56:58

+1

從我讀他的問題的方式來看,是和不是。看起來他需要的距離爲1或2的距離,這兩個問題有效地互相交換字母。根據輸入,使用levenstein算法將輸入過濾爲只有1-2個距離的輸入,然後分析2s以檢查附加約束似乎是一種合理的方式。 – RHSeeger 2012-02-17 14:03:15