2014-09-22 18 views
2

對於作業分配,我必須輸入2個用戶輸入的字符串,並找出有多少字母是共同的(在兩個字符串的相同位置),以及找到常用字母。 。例如,對於兩個字符串'貓'和'老鼠',有2個常見的字母位置(在這種情況下是位置2和3),並且常用字母也是2,因爲'a'被找到一個't' '也被發現一次..在Python中查找2個字符串之間的通用字母

所以我做了一個程序,它運行良好,但後來我的老師更新了更多的例子,具體例子重複字母,我的程序是不工作的..對於例如,字符串'ahahaha'和'huhu' - 在同一位置有0個常見字母,但它們之間有3個常見字母(因爲字符串2中的'h' ppears在字符串1,三次..)

我的整個問題是,我不知道如何計算如果「h」多次出現在第一個字符串,以及我不知道如何不檢查第二次在忽忽「H」,因爲它應該只算獨特的字母,所以總體常見的字母數應爲2 ..

這是我當前的代碼:

S1 = input("Enter a string: ") 
S2 = input("Enter a string: ") 
i = 0 
big_string = 0 
short_string = 0 
same_letter = 0 
common_letters = 0 

if len(S1) > len(S2): 
    big_string = len(S1) 
    short_string = len(S2) 
elif len(S1) < len(S2): 
    big_string = len(S2) 
    short_string = len(S1) 
elif len(S1) == len(S2): 
    big_string = short_string = len(S1) 

while i < short_string: 
    if (S1[i] == S2[i]) and (S1[i] in S2): 
     same_letter += 1 
     common_letters += 1 
    elif (S1[i] == S2[i]): 
     same_letter += 1 
    elif (S1[i] in S2): 
     common_letters += 1 
    i += 1 

print("Number of positions with the same letter: ", same_letter) 
print("Number of letters from S1 that are also in S2: ", common_letters) 

所以這段代碼工作了沒有常見字母的字符串,但是當我嘗試使用「ahahaha」和「huhu」時,我得到0個常見位置(這是合理的)和2個常見字母(當它應該是3)時。我認爲它是migh將不起作用,如果我嘗試添加以下內容:我不要求直接回答或一段代碼

while x < short_string: 
    if S1[i] in S2[x]: 
     common_letters += 1 
    else: 
     pass 
    x += 1 

然而,這也不行......

要做到這一點,因爲我想做我自己的,但我只需要幾個提示或想法如何做到這一點..

注意:我不能使用任何我們沒有在課堂上採取的功能,我們在類只做基本的循環和字符串..

+0

更簡單的方法:創建兩個數組,每個數組有26個條目(a-z)。循環兩個字符串並將它們「盤點」到兩個數組中。例如「foobar」給你a(1),b(1),f(1),o(2),r(1)'。然後循環兩個數組,並查看哪些字母BOTH具有非零計數。 – 2014-09-22 16:46:03

+1

使用set和set.intersection – joaquin 2014-09-22 16:49:13

+1

覆蓋循環時,你有覆蓋枚舉()? – TML 2014-09-22 21:40:12

回答

0

既然你不能使用數組或列表,

也許嘗試將每個常用字符添加到var_string,然後在增加公用計數器之前,如果c不在var_string: 中,則測試 ,以便您不會多次計算相同的字符。

0

因爲只打算查看ahahaha(因爲huhu,最短的字符串,只有4個字符長)中的4個總字符,所以您只得到'2'。改變你的while循環代替big_string,然後將(len(S2) > i) and添加到你的兩個條件測試中;最後的測試執行in,所以它不會導致索引長度的問題。

注:以上所有隱含假定len(S1)> = len(S2);這應該很容易確保使用條件和賦值,並且可以簡化代碼的其他部分。您可以完全替換第一個塊類似於:

if (len(S2) > len(S1)): (S2, S1) = (S1, S2) 
big_string = len(S1) 
short_string = len(S2) 
0

您需要一個數據結構,如multidict。據我所知,標準庫中最相似的數據結構是collectionsCounter

對於簡單的頻率計數:

>>> from collections import Counter 
>>> strings = ['cat', 'rat'] 
>>> counters = [Counter(s) for s in strings] 
>>> sum((counters[0] & counters[1]).values()) 
2 

隨着指數計數:

>>> counters = [Counter(zip(s, range(len(s)))) for s in strings] 
>>> sum(counters[0] & counters[1].values()) 
2 

對於你的例子ahahahahuhu,你應該得到20,分別因爲我們得到兩個h但在錯誤的位置。

由於您不能使用高級構造,因此您只需要使用數組來模擬counter

  • 創建26點元素的陣列
  • 遍歷字符串和同時在陣列再次更新相關的索引,對每個字母
  • 環路和總結各自索引的最小值。
0

我們可以通過使用一個內部的另一種循環,如果你輸入「ahahaha」和「忽忽」這個代碼採取大 字符串的第一個字符「a」時,按如下

int y=0; 
for(i=0;i<big_string ;i++) 
    { 
    for(j=0;j<d;j++) 
     { 
      if(s1[i]==s2[j]) 
      {y++;} 
     } 

解決這個它進入第一個foor循環。當它進入第二個循環 它需要小字符串'h'的第一個字母,並將它們進行比較,因爲它們不是 等於y不會遞增。在下一步它出來第二個for循環,但 停留在第一個循環,所以它認爲大字符串'a'的第一個字符和 比較它與小字符串'u'的第二個字母,因爲'j'增加,即使 這兩種情況都不相等,y保持爲零。 Y被遞增 下列情況下: -

    當它比較大的字符串的「h」以及第一y字符串的小字母的第二個字母
  1. 遞增一次I,E Y = 1;
  2. 當它比較大字符串'h'的第四個字母並且第一個字符串y的小寫字母再次遞增時i,e y = 2;
  3. 當比較大字符串'h'的第六個字母和第一個字符串y的小寫字母再次遞增時i,e y = 3;

最終輸出是3.我認爲這就是我們想要的。

1

一個較短的版本是這樣的:

def gen1(listItem): 
    returnValue = [] 
    for character in listItem: 
     if character not in returnValue and character != " ": 
      returnValue.append(character) 
    return returnValue 

st = "first string" 
r1 = gen1(st) 
st2 = "second string" 
r2 = gen1(st2) 

if len(st)> len(st2): 
    print list(set(r1).intersection(r2)) 
else: 
    print list(set(r2).intersection(r1)) 

注: 這是一個很老的文章,但自從有了新的活動,我貼我的版本。

相關問題