2015-11-06 113 views
0

我試圖通過使用它們的索引(開始和結束位置)而不是單詞來確定兩個單詞是否在一個字符串內重疊。什麼是簡單的方法來檢查兩個單詞是否在Python中使用索引完全重疊

例如:

str = "testme" 
start_word_1 = 0 
end_word_1 = 4 
start_word_2 = 4 
end_word_2 = 6 

在本例中STR [0:4]爲 「測試」 和STR [4:6]是 「我」。這些不重疊,但單詞1的結尾與單詞2的開頭相同。所以這些都沒問題。我只是覺得我讓它變得太複雜了,還有更簡單的代碼來涵蓋完全重疊的單詞和只是部分重疊的單詞。謝謝!

澄清重疊:我的意思是在字符串片str [0:4](「test」)和str [4:6](「我」)不重疊。他們沒事。

但str [0:5](「testm」)確實與str [4:6](「me」)重疊。另外,str [0:6](「testme」)確實與str [1:4](「est」)重疊,其中此處的「est」完全位於「testme」的內部。

這將用於文本突出顯示,我不希望任何東西成爲衝突的亮點。

+0

單詞'重疊'是什麼意思? –

+0

我可能會這樣做與範圍和設置相交 –

+0

我的意思是文本跨度重疊,這意味着兩個概念重疊。我會編輯澄清。 – JTFouquier

回答

1

我覺得像這樣很簡單,並滿足您的(確實有點奇怪)的要求。請注意,這是使用看起來像切片串,對應於你的使用指標,而不是文字本身:

In [1]: def words_overlap(slice1, slice2): 
    ...:  """Take two strings representing slices (e.g. 'x:y') and 
    ...:  return a boolean indicating whether they overlap""" 
    ...:  if slice1[0] < slice2[0]: # slice1 is leftmost 
    ...:   return slice2[0] < slice1[2] # slice2 ends before slice1 starts 
    ...:  else: 
    ...:   return slice1[0] < slice2[2] 
    ...: 

In [2]: words_overlap('1:3', '2:4') 
Out[2]: True 

In [3]: words_overlap('2:4', '1:3') 
Out[3]: True 

In [4]: words_overlap('2:3', '5:7') 
Out[4]: False 

In [5]: words_overlap('0:4', '4:6') 
Out[5]: False 

它所做的是檢測其切片最左邊用比測試一個簡單的少,然後如果告訴你最右邊的切片在最左邊的切片結束之前開始。

應該是相當有效的,因爲它只涉及兩個整數比較。

+1

是的,這工作,並幫助我思考並保持簡單,這是,我讓它變得非常複雜。 ;) 謝謝!! – JTFouquier

+0

我相信你知道這一點,但如果有人看到這個答案,它不適用於指數> 9,因爲你做了一個分片。我想你必須預先處理。 – JTFouquier

+0

@ jennifer06262016這只是一個例子。對於兩位數的索引(和更進一步的),你需要通過像下面這樣實際分​​割片來使它更穩健:'start_word_1,end_word_1 = slice1.split(':')'然後用這種方式處理它們。 –

1

也許這樣?

start1 < end2 and start2 < end1 

這意味着:每個兩個詞的開始更早比其它字結束,因此它們確實重疊

2

案例1:字2是的一個子字符串(或匹配)字1 (反之亦然)

word1 in word2 or word2 in word1 

ex。 「StackExchange」 和 「粘性」

案例2:2個字重疊在第1個字的結束

for i in range(1, len(word2)): word1.endswith(word2[:-i])

前。 「計算器」 和 「流動」

案例3:2個字重疊在第1個字的開頭

for i in range(1, len(word2)): word1.startswith(word2[i:])

前。 「徽章」和「terribad」

+0

這個'有效'(也許違反了OP的「不使用單詞」約束),但我認爲它可以比這些循環更有效地完成。 –

+0

@ two-bit-alchemist我同意,這不應該被用作算法,它只是展示瞭如何使用子字符串來識別每一組重疊。任何非變換的非壓縮算法都會在最壞的情況下考慮'n + m-1'串配對。情況1使'n-m + 1',情況2使'm-1',情況3使'm-1'比較。 –

相關問題