의 내가 두 문자열을 있다고 가정 해 봅시다, s1 = "1234"
그리고 s2 ="34567"
접미사 접두사 사이에 너무 긴 공통 s1
하고 s2
있다 "34"
. 이 일치하는 부분 ( "34"
)을 빠르게 얻을 수있는 비단뱀적인 방법이 있는지 알고 싶습니다 .
아래처럼 순진한 방법으로 할 수 있지만이 작업을 수행하는 데 흥미로운 라이브러리 함수 나 알고리즘이 있는지 알고 싶습니다.
s1 = "1234"
s2 = "34567"
length1 = len(s1)
length2 = len(s2)
length = (length1 if length1<= length2 else length2)
for i in reversed(range(0, length)):
if s1[-i - 1:] == s2[:i + 1]:
print(s1[-i - 1:])
break
elif i > 0:
continue
else:
print("no common suffix prefix")
산출:
34
컴팩트하고 스마트 한 것을 원합니다!
알고리즘의 논리는 가능한 한 간단하지만 표기법을 확실히 압축 할 수 있습니다. 예를 들어 size n
접미사에 대해 size 접두사를 확인하는 n
것은 간단합니다.
s1[-n:] == s2[:n]
문자열 길이를 확인하는 데 사용하는 삼항 연산자는 다음과 같습니다.
min(len(s1), len(s2))
범위는 그 자체로 뒤로 갈 수 있습니다. 의 반대 range(x)
는
range(x - 1, -1, -1)
감소하는 값마다이를 확인 n
하고 0이 아닌 첫 번째 결과를 반환 하는 반복기를 만들 수 있습니다 . 운 좋게도 next
반복기가 비어있는 경우 기본값을 나타내는 두 번째 인수를 허용합니다.
common = next((s2[:n] for n in range(min(len(s1), len(s2)) - 1, -1, -1) if s1[-n:] == s2[:n]), '')
그것은 의무적 인 한 줄입니다. 더 읽기 쉬운 솔루션은 다음과 같습니다.
def common_fix(s1, s2):
steps = range(min(len(s1), len(s2)) - 1, -1, -1)
return next((s2[:n] for n in steps if s1[-n:] == s2[:n]), '')
일반적으로 기능을 유지하고 인쇄를 분리하십시오. 값을 얻은 다음 처리합니다 (인쇄 또는 다른 방법).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다