2010-07-03 2 views
0

주어진 문자열이 회문인지 확인하기위한 메서드를 작성하고 싶습니다. 예 : "부인, 나는 아담이다", 또는 "남자, 계획, 운하, 파나마".C++ 코딩 논리 - 다양한 아이디어

함수의 프로토 타입은 다음

bool is_palindrome(char const * str) 

I는 문자열의 맨 끝에서 역방향 순방향 &을 이동 어떤지를 확인하는 간단한 논리를 갖는다. 그러나, 나는 이것을 어떻게 효율적으로 할 수 있는지 알고 싶습니다. 모든 아이디어는 C++ 전문가로부터 환영받습니다.

+0

는 http://stackoverflow.com/questions/248161/palindrome-detection-efficiency 및 http://stackoverflow.com/questions/228518/palindrome-golf있다. 가능한 뎁? – pmr

+0

공백, 구두점 및 대문자를 엄격하게 무시하는 경우 (예 : 거의 보편적 인 조건, BTW) 두 가지 예는 모두 문장으로 만 사용됩니다. 이것이 당신의 접근 방법에 어떤 영향을 미칠 것입니까? 그 중 하나 이상을 시행하는 변형에 대한 코드 가치가 있습니까? 어떻게 그럴 수 있니? 모든 가능한 조합에 대해 깔끔한 인터페이스를 제공 할 수 있습니까? 일단 그렇게하면, 문제를 이해하게됩니다. 건배. – dmckee

답변

1

훨씬 효율적인 방법이 있다고 생각하지 않습니다. 문자열의 모든 문자를 비교해야합니다.

가능한 최적화 : 문자열의 처음 절반 만 확인하면 불일치를 찾자 마자 빨리 탈출 할 수 있습니다.

bool is_palindrome(char const * str) 
{ 
    size_t len = strlen(str); 
    bool isPalindrome = false; // It's debatable if a blank string is a palindrome or not 

    for(int i = 0; i < len/2; i++) 
    { 
     if(str[i] != str[len - i - 1]) 
     { 
      isPalindrome = false; 
      break; 
     } 
     isPalindrome = true; 
    } 

    return isPalindrome; 
} 
+0

소스 코드에서 배열 인덱서 대신 두 개의 포인터를 사용하면 컴파일 된 코드가 더 엄격해질 수 있습니다. 예 : 'if (* startPtr ++! = * endPtr--) {...}' – ChrisW