2017-03-29 1 views
2

EDIT : 이것이 매우 유용한 스레드 였기 때문에 최종 해결책을 게시하고 일부 최종 결과를 추가하려고합니다. 아래 두 대답의 조언을 사용하여 솔루션을 만들 수있었습니다. 내가 아나그램을 정의한 헬퍼 함수를 ​​추가했습니다. 여기 내 최종 솔루션입니다 :Python 2.7 한 문자열의 일부 anagram이 다른 문자열의 부분 문자열인지 찾는 경우

def anagram(s1, s2): 
    s1 = list(s1) 
    s2 = list(s2) 
    s1.sort() 
    s2.sort() 
    return s1 == s2 

def Question1(t, s): 
    t_len = len(t) 
    s_len = len(s) 
    t_sort = sorted(t) 
    for start in range(s_len - t_len + 1): 
     if anagram(s[start: start+t_len], t): 
      return True 
    return False 

print Question1("app", "paple") 

내가 연습 기술 면접 질문에 일하고 나는 다음과 같은 질문에 붙어 : 나는 다음을 일한

Find whether an anagram of string t is a substring of s

내 코드의 두 변종, 그리고 이것에 대한 해결책은 두 사람 사이의 십자가에 놓여 있다고 믿습니다. 내가 겪고있는 문제는 입력에 관계없이 첫 코드가 항상 False.을 인쇄한다는 것입니다. 두 번째 변형은 어느 정도 작동합니다. 그러나 개별 문자를 정렬 할 수는 없습니다. 나는이 두 가지 사이에 놓여있는 솔루션이 생각하지만, 내가 어떻게 알아내는 데 문제가

def Question1(): 
    # Define strings as raw user input. 
    t = raw_input("Enter phrase t:") 
    s = raw_input("Enter phrase s:") 
    # use a loop to find if t is in s. 
    if t.lower() in s.lower(): 
     print("True!") 
    else: 
     print("False.") 

Question1() 

: 인쇄됩니다 예를 t=jks s=jksd를 들어 True! 그러나 t=kjs s=jksdFalse.

def Question1(): 
    # Define strings as raw user input. 
    t = raw_input("Enter phrase t:") 
    s = raw_input("Enter phrase s:") 
    # Use the sorted function to find if t in s 
    if sorted(t.lower()) in sorted(s.lower()): 
     print("True!") 
    else: 
     print("False.") 

Question1() 

근무 변형을 인쇄합니다 이 상황에서는 sorted을 사용하십시오.

+0

문자의 조합을 모두 가져 와서 s와 비교해야합니다. s를 정렬하는 것이 옳지 않습니다. – Shiping

답변

4

당신이 바로 그 궤도에 아주 많이있어. 먼저 두 번째 시도에서 루프가 없음을 유의하십시오.

문제는 을 모두으로 정렬 한 다음 그 중 정렬 된 (t)을 찾아 볼 수 없다는 것입니다. 오히려 s의 각 len (t) 크기 부분 문자열을 고려하고 정렬 된 t에 대해 인 을 확인해야합니다. 사소한 예를 생각해

t = "abd" 
s = "abdc" 

은 하찮게 t가 포함되어 있습니다. 그러나 정렬 할 때 문자열 abdabcd이 표시되고 인 비교 문자열은 실패합니다. 정렬은 다른 문자를 가져옵니다.

대신에 의 크기로 단계별로 조정해야합니다.

t_len = len(t) 
s_len = len(s) 
t_sort = sorted(t) 
for start in range(s_len - t_len + 1): 
    chunk = s[start:start+t_len] 
    if t_sort == sorted(chunk): 
     # SUCCESS!! 
+1

외관상으로는 * * 1 개의 맞은 방법 ... ;-) –

+0

그것은 아름답게 설명되고, 저를 위해 이것을 간단하게하기를 당신을 순전히 감사한다. 이 질문에 대한 답변으로 표시 했으므로 도움을 주셔서 다시 한 번 감사드립니다. – NoOrangeJuice

+1

도움이 될 수있어서 기쁩니다. 내가 가르치고있을 때 돈을 받았던 것을 소급하여 정당화합니다. :-) – Prune

2

귀하의 문제는 "하위 문자열"요구 사항에 있다고 생각합니다. 정렬하면 순서를 파괴합니다. 즉, string1의 아나 그램이 string2의 부분 문자열의 아나 그램임을 결정할 수는 있지만 실제로 string2를 순서대로 처리 할 때까지는 정답을 얻을 수 없습니다.

나는 길이가 len(s1) 인 모든 하위 문자열을 반복하여 제안합니다 (s2). 이것은 for 루프입니다. 부분 문자열이 있으면 s1을 사용하여 이들을 (정렬 된 정렬 된 정렬 된) 값과 비교하여 s1의 재 배열이 있는지를 결정할 수 있습니다. 연속적인 부분 문자열은 s2입니다.

즉이 :

s1 = "jks" 
s2 = "aksjd" 

print('s1=',s1, ' s2=', s2) 
for offset in range(len(s2) - len(s1) + 1): 
    ss2 = s2[offset:offset+len(s1)] 
    if sorted(ss2) == sorted(s1): 
     print('{} is an anagram of {} at offset {} in {}'.format(ss2, s1, offset, s2)) 
+0

나는이 대답들 모두가 매우 도움이되었고 단지 하나만 고르는 것이 어렵다고 말하고 싶다. 두 가지 답변을 선택하는 방법이 있습니까? 스택 오버플로가 상당히 새로움 – NoOrangeJuice

+1

아니요. "가장 도움이되는"것을 선택하고 계속 진행하십시오. 운명의 주위에 속이는 많음 ... –

관련 문제