перечислить все подстроки строки n с фиксированной длиной в цели c - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь написать метод, который генерирует все подстроки данного NSString с фиксированной длиной, но я застреваю. Вот идея того, что я хочу:

-(int)countGoodSubstringsOfString:(NSString*)str ofLength:(int)len {
    int cnt = 0;
    for (NSString *substr substring of str of length len) {
        if ([self isGoodSubstring:substr ofString:str])
            cnt++;
    }
    return cnt;
}

Под подстрокой я подразумеваю все возможные комбинации len символов из str. Если str = @"ABCDE" и len = 4, то мне нужно получить 5 подстрок: @"ABCD", @"ABCE", @"ABDE", @"ACDE", @"BCDE".

Если бы len было исправлено, то я мог бы просто написать вложенные циклы for, чтобы получить все подстроки, подобные этой

NSString *substr = @"";
for (int i=0; i<str.length-len+1; ++i) {
    substr = [substr stringByAppendingString:[str substringWithRange:NSMakeRange(i,1)]];
    for (int j=i+1; j<str.length-len+2; ++j) {
        substr = [substr stringByAppendingString:[str substringWithRange:NSMakeRange(j,1)]];
        ...
            for(int k=j+1; k<str.length; ++k) {
                substr = [substr stringByAppendingString:[str substringWithRange:NSMakeRange(k,1)]];
                if ([self isGoodSubstring:substr ofString:str])
                    cnt++;

Но поскольку len является частью ввода, я не могу знать это заранее. Как я могу обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 31 января 2012

Не совсем понятно, что вы пытаетесь сделать, но если вы хотите получить все подстроки строки, разделенные @ "" заданной длины - тогда это выглядит так:

NSString *str = @"length string blah lskdnflskdls lkjbfe lkfngj";
int length = 6;
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF.length = %d", length];
NSArray *arr = [[str componentsSeparatedByString:@" "] filteredArrayUsingPredicate:filter];
NSLog(@"filtered substrings: %@", arr);

вывод выглядит так:

filtered substrings: (
    length,
    string,
    lkjbfe,
    lkfngj
)
0 голосов
/ 31 января 2012

РЕДАКТИРОВАТЬ : Мне наконец удалось найти решение. Он использует те же идеи, что и ваши, но он рекурсивный, поэтому вам не нужно знать длину.

-(int)countGoodSubstringsOfString:(NSString*)str ofLength:(int)len recStr:(NSString *)recStr from:(int)from{
  /// C(str.length, str.length-len)
  if (!recStr) {
    recStr = @"";
  }
  if ([recStr length]==len) {
    if ([self isGoodSubstring:substr ofString:str])
      return 1;
    return 0;
  }
  int cnt = 0;
  for (int i=from; i<=str.length-len+[recStr length]; i++) {
    NSString *substr = [recStr stringByAppendingString:[str substringWithRange:NSMakeRange(i, 1)]];
    cnt += [self countGoodSubstringsOfString:str ofLength:len recStr:substr from:i+1];
  }
  return cnt;
}

Первоначальный вызов должен выглядеть примерно так:

int cnt = [self countGoodSubstringsOfString:@"ABCDEF" ofLength:4 recStr:nil from:0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...