2016-12-07 1 views
2

그래서이 사이트와 다른 사람들을 둘러보고 파이썬에서 문자열을 반복하는 방법에 대해 알아 보았습니다. 특정 부분 문자열을 찾아 역순으로 검색하여 두 개가 같은 순서인지 확인합니다. Palindrome을 얻으십시오. 테스트 케이스 중 일부는 인덱싱을 통해 찾는 방법에 대해 혼란스럽고 혼란 스럽기 때문에 문제입니다.파이썬 회귀선을 찾기 위해 문자열 반복하기

이 모든 작동 내 코드이지만,이 테스트 케이스 :

def countPalindromes(s): 
    count = 0 
    firstindex = 0 
    lastindex = len(str)-1 
    while firstindex != lastindex and firstindex <= lastindex: 
     ch1 = s[firstindex:lastindex] 
     ch2 = s[lastindex:firstindex:-1] 
     if ch1 == ch2: 
      count +=1 
     firstindex +=1 
     lastindex -=1 
    return count 

이 코드는 다음 회문 작동 : "레이싱 카", "", 및 "abqc을". 이 Palindromes "aaaa"및 "abacccaba"에는 작동하지 않습니다.

"aaaa"에는 6 개의 문장이 있고 "abacccaba"에는 8 개의 문장이 있습니다. 이것은 내 문제가 발생하는 곳이며, 나는 그것을 파악할 수 없다. "aaaa"를위한 6 개의 문장을 위해 나는 각각 두번 aaaa, aaa, aa를 얻습니다. "abacccaba"는 8 가지 문장으로, 나는 abacccaba, bacccab, accca, ccc, aba, aba를 얻는다.

나는 이것이 혼란스러운 질문이지만, "aaaa"는 2 개, "abacccaba"는 4 개로 제한되어 있기 때문에 문제를 해결하는 방법을 놓쳤습니다. 어떻게 하위 문자열을 잘라내어 이러한 값을 얻을 수 있는지 생각해보십시오.

미리 감사드립니다.

답변

1

while firstindex != lastindex and firstindex <= lastindex:은 단일 문자 palindrome의 경우를 놓칩니다.

또한 aa에는 0 : 1, 0 : 2 및 1 : 2의 세 가지 문장이 들어있는 경우가 누락되었습니다.

aaaa에 대한 일부 문장을 놓친 것 같습니다. 10이 있습니다

aaaa 
a 
a 
    a 
    a 
aa 
aa 
    aa 
aaa 
aaa 

단일 문자 회문이 포함되지 않는 경우, 우리가 6

어느 쪽이든, 당신은 가능한 회문 모든 문자열을 고려할 필요가있다; 중간에있는 것만이 아닙니다. 문자열을 역순으로 비교하는 것은 파이썬에서 매우 쉽게 할 수 있습니다 : s == s[::-1].

Getting all the substrings is easy too :

len([a for a in get_all_substrings(string) if len(a) > 1 and a == a[::-1]]) 
+0

그래, 나는 누락 된 일부 합계를 발견 한 유일한 사람이 아니다. 나는 그들이 2보다 커야한다고 언급 했어야했는데, 아직 실종되었다.불행히도 이것은 코드 주자 중 하나에 있으므로 기대되는 결과물이 필요합니다. 테스트 케이스가 정확하다는 것을 알기 위해 제공 한 내용을 살펴보고 해결해 보겠습니다. –

+0

한 가지 더 :'firstindex! = lastindex와 firstindex <= lastindex :'는''firstindex 로 단순화 될 수 있습니다. –

+0

아, 감사합니다! –

0

내가 당신을 생각 :

substrings = [a for a in get_all_substrings(string) if len(a) > 1] 

이 상당히 정직해야한다 결합 :

def get_all_substrings(input_string): 
    length = len(input_string) 
    return [input_string[i:j+1] for i in range(length) for j in range(i,length)] 

길이 < 2의 문자열을 필터링도 쉽게 문자열이 회문인지 검사하기 위해 함수 (f)를 개별적으로 작성해야합니다.

그런 다음 문자의 하위 문자열을 선택하는 함수 (g)를 만듭니다.

예 : 문자열 abcd에서 g는 a, b, c, d, ab, bc, cd, abc, bcd, abcd를 선택할 것입니다. 그런 다음이 문자열 각각에 대해 f를 적용하여 회문 수를 얻습니다.

관련 문제