Check if string is palindrome in objective c

前端 未结 10 2215
执念已碎
执念已碎 2021-01-07 02:15

I\'m trying to check if a string is palindrome or not using objective c. I\'m new to programming without any experience in other programming languages so bear with me please

相关标签:
10条回答
  • 2021-01-07 02:27
     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");
        }
    
    0 讨论(0)
  • 2021-01-07 02:27
    We can also do this using NSRange like this...
    enter code  NSString *fullname=@"123321";
    NSRange rangeforFirst=NSMakeRange(0, 1);
    NSRange rangeforlast=NSMakeRange(fullname.length-1, 1);
    BOOL ispalindrome;
    for (int i=0; i<fullname.length; i++) {
        if (![[fullname substringWithRange:rangeforFirst] isEqualToString:[fullname substringWithRange:rangeforlast]]) {
            NSLog(@"not match");
            ispalindrome=NO;
            return;
        }
        i++;
        rangeforFirst=NSMakeRange(i, 1);
        rangeforlast=NSMakeRange(fullname.length-i-1, 1);
    }
    NSLog(@"no is %@",(ispalindrome) ? @"matched" :@"not matched");
    
    0 讨论(0)
  • 2021-01-07 02:30

    Apart from the unbalanced braces, accessing a character from NSString is more complicated than using array notation. You need to use the method characterAtIndex: You can optimise your code, by breaking out of the loop if a palindrome is impossible and taking the length call outside of the for loop.

    NSString *p = @"121";
    
    NSInteger length = p.length;
    NSInteger halfLength = (length / 2);
    
    BOOL isPalindrome = YES;
    
    for (int i = 0; i < halfLength; i++) {
         if ([p characterAtIndex:i] != [p characterAtIndex:length - i - 1]) {
            isPalindrome = NO;
            break;
         }
    }
    

    It may be desirable to check case insensitively. To do this, make the string be all lowercase before looping, using the lowercaseString method.

    As pointed out by Nikolai in the comments, this would only work for strings containing 'normal' unicode characters, which is often not true — such as when using UTF8 for foreign languages. If this is a possibility, use the following code instead, which checks composed character sequences rather than individual characters.

    NSString *p = @"121";
    NSInteger length = p.length;
    
    NSInteger halfLength = length / 2;
    
    __block BOOL isPalindrome = YES;
    
    [p enumerateSubstringsInRange:NSMakeRange(0, halfLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
         NSRange otherRange = [p rangeOfComposedCharacterSequenceAtIndex:length - enclosingRange.location - 1];
    
         if (![substring isEqualToString:[p substringWithRange:otherRange]]) {
             isPalindrome = NO;
             *stop = YES;
         }
    }];
    
    0 讨论(0)
  • 2021-01-07 02:31

    You're trying to use an NSString as an NSArray (or probably, like a C string), which won't work. Instead, you need to use the NSString method characterAtIndex: to get the character to test.

    0 讨论(0)
  • 2021-01-07 02:32

    Recursive

    - (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];
    }
    

    Non Recursive

    - (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;
    }
    

    you can call:

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

    Swift 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)
    

    Also, you can use swift 3 methods like a string extension... It's more elegant. extension sample

    0 讨论(0)
  • 2021-01-07 02:40
    NSString *str1 = @"racecar";
        NSMutableString *str2 = [[NSMutableString alloc] init];
        NSInteger strLength = [str1 length]-1;
        for (NSInteger i=strLength; i>=0; i--)
        {
           [str2 appendString:[NSString stringWithFormat:@"%C",[str1 characterAtIndex:i]]];
    
        }
     if ([str1 isEqual:str2])
            {
                NSLog(@"str %@ is palindrome",str1);
            }
    
    0 讨论(0)
提交回复
热议问题