2

文字列が回文であるか、目的の c を使用していないかを確認しようとしています。私は他のプログラミング言語での経験がなく、プログラミングが初めてなので、ご容赦ください。文字列の最初の位置が最後の位置と等しい場合、文字列は回文であると言いたい場合の条件で行き詰まります。

何が間違っているのですか?

int main (int argc, const char * argv[])
{
    NSString *p = @"121" ;   
    BOOL palindrome = TRUE;
    for (int i = 0 ; i<p.length/2+1 ; i++)
    {
         if (p[i] != p [p.Length - i - 1])
                    palindrome = false;
    }
    return (0);
}
4

10 に答える 10

2
var str: NSString = "123321"
var length = str.length
var isPalindrome = true

for index in 0...length/2{
    if(str.characterAtIndex(index) != str.characterAtIndex(length-1 - index)){
        print("\(index )not palindrome")
        isPalindrome = false
        break
    }
}

print("is palindrome: \(isPalindrome)")
于 2016-10-23T17:37:04.433 に答える
1

構成された文字シーケンスを正しく処理する答えがまだないように思われるので、2 セントを追加します。

NSString *testString = @"\u00E0 a\u0300"; // "à à"

NSMutableArray *logicalCharacters = [NSMutableArray array];
[testString enumerateSubstringsInRange:(NSRange){0, [testString length]}
                               options:NSStringEnumerationByComposedCharacterSequences
                            usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
{
    [logicalCharacters addObject:substring];
}];

NSUInteger count = [logicalCharacters count];
BOOL isPalindrome = YES;
for (NSUInteger idx = 0; idx < count / 2; ++idx) {
    NSString *a = logicalCharacters[idx];
    NSString *b = logicalCharacters[count - idx - 1];
    if ([a localizedCaseInsensitiveCompare:b] != NSOrderedSame) {
        isPalindrome = NO;
        break;
    }
}

NSLog(@"isPalindrome: %d", isPalindrome);

これにより、文字列が論理文字 (通常のユーザーが「文字」と呼ぶ文字列の要素) の配列に分割されます。

于 2013-07-30T14:13:33.183 に答える
1

再帰的

- (BOOL)isPaliRec:(NSString*)str :(int)start :(int)end{
    if(start >= end)
       return YES;
    else if([str characterAtIndex:start] != [str characterAtIndex:end])
       return NO;
    else
       return [self isPaliRec:str :++start :--end];
}

非再帰的

- (BOOL)isPali:(NSString*)str{
   for (int i=0; i<str.length/2; i++)
      if([str characterAtIndex:i] != [str characterAtIndex:(str.length-i-1)])
         return NO;

   return YES;
}

あなたは呼び出すことができます:

NSString *str = @"arara";
[self isPaliRec:str :0 :(int)str.length-1];
[self isPali:str];

スウィフト 3:

// Recursive
func isPaliRec(str: String, start: Int = 0, end: Int = str.characters.count-1) -> Bool {
    if start >= end {
        return true
    } else if str[str.index(str.startIndex, offsetBy: start)] != str[str.index(str.startIndex, offsetBy: end)] {
        return false
    } else {
        return isPaliRec(str: str, start: start+1, end: end-1)
    }
}

// Non Recursive
func isPali(str: String) -> Bool {
    for i in 0..<str.characters.count/2 {
        let endIndex = str.characters.count-i-1
        if str[str.index(str.startIndex, offsetBy: i)] != str[str.index(str.startIndex, offsetBy: endIndex)] {
            return false
        }
    }
    return true
}

// Using
let str = "arara"
isPaliRec(str: str)
isPali(str: str)

また、次のようなSwift 3メソッドを使用できますstring extension...よりエレガントです。延長サンプル

于 2015-04-29T06:39:54.473 に答える
0
 NSString *str=self.txtFld.text;
 int count=str.length-1;

    for (int i=0; i<count; i++) {
        char firstChar=[str characterAtIndex:i];
        char lastChar=[str characterAtIndex:count-i];
        NSLog(@"first=%c and last=%c",firstChar,lastChar);
        if (firstChar !=lastChar) {
            break;
        }
        else
            NSLog(@"Pailndrome");
    }
于 2013-12-30T17:02:17.710 に答える