有没有人知道是否有一种方法来对ASCII字符的NSString进行排序?理想情况下,我想要一个方法来检查一个字符串是否是另一个字符串的排列,所以我的想法是以规范的方式对两个字符串进行排序,然后比较它们。任何想法将不胜感激。感谢。
编辑:这是我更准确的追求。我想要一个方法,它将两个NSStrings
作为输入并返回BOOL
:
- (BOOL)isPermutation:(NSString *)string1
ofString:(NSString *)string2;
如果一个字符串可以重新排列到另一个字符串中,则返回的值应为YES
,否则为NO
。
NSStrings是具有ASCII字符的任意字符串,而不是句子,数字或单词。只是带有ASCII字符的任意字符串。
答案 0 :(得分:7)
你真的需要排序来检查这个吗?考虑算法。
create 2 counter arrays, ac and bc, both of size 128 initialize them with 0 for each char c in string a make ac[c]++ for each char c in string b make bc[c]++ if all 128 counters in ac and bc are same, then they r permutation of one another
这甚至可以比排序更快。
编辑:这是一种可能的实施方式。由于我没有编译代码,可能会有一些小错误。
- (BOOL)isPermutation:(NSString *)string1 ofString:(NSString *)string2 { if ([string1 length] != [string2 length]) { return FALSE; } NSInteger counter1[128]; NSInteger counter2[128]; NSInteger i; NSInteger len = [string1 length]; for (i = 0; i < 128; i++) { counter1[i] = counter2[i] = 0; } for (i = 0; i < len; i++) { unichar ch1 = [string1 characterAtIndex:i]; unichar ch2 = [string2 characterAtIndex:i]; counter1[ch1]++; counter2[ch2]++; } for (i = 0; i < 128; i++) { if (counter1[i] != counter2[i]) { return FALSE; } } return TRUE; }
答案 1 :(得分:2)
如果您的字符始终是ASCII,您可以获取字节数,然后使用其中一个POSIX排序例程:
char myCString[[myNSString length] + 1];
memcpy(myCString, [myNSString UTF8String], [myNSString length]);
qsort(myCString, [myNSString length], 1, compareChars);
其中compareChars()
是您编写的用于进行字符到字符比较的函数 - 在这种情况下可能与<
一样简单。
答案 2 :(得分:2)
你的意思是,对字符串中的字母进行排序? NSString
上没有方法,但创建一个方法很容易。 Here's一个快速而肮脏的例子(您可能需要根据自己的目的进行调整):
#import <Foundation/Foundation.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static int compare_char(const char *a, const char *b)
{
if (*a > *b) {
return 1;
} else if (*a < *b) {
return -1;
} else {
return 0;
}
}
@interface NSString (Sorting)
- (NSString *)stringBySortingCharacters;
@end
@implementation NSString (Sorting)
- (NSString *)stringBySortingCharacters
{
const char *s = [self UTF8String];
char *s2 = (char *) calloc([self length]+1, 1);
if (!s2) return nil;
strncpy(s2, s, [self length]);
qsort(s2, [self length], 1, compare_char);
NSString *ret = [NSString stringWithUTF8String:s2];
free(s2);
return ret;
}
@end
int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *s1 = @"string";
NSString *s2 = @"the quick brown fox jumps over the lazy dog";
printf("Sorted: %s\n", [[s1 stringBySortingCharacters] UTF8String]);
printf("Sorted: %s\n", [[s2 stringBySortingCharacters] UTF8String]);
[pool release];
return 0;
}