使用OC写算法之BF算法

BF算法简介

BF算法是Brute Force算法的简称(如果你发挥你得想象 你也可以称之为Boy Friend算法),BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。正是因为这种蛮干的比较,也被称为蛮干算法

BF算法代码实现方式1
#pragma  mark -  暴力的BF算法
#pragma  mark -

/**
 传入一个主串和字串 匹配是否能匹配成功

 @param source 主串
 @param target 字串
 @return 成功返回主串中开始索引 失败返回-1
 */
- (int)bruteForce1WithSource:(NSString *)source target:(NSString *)target {
    //主串遍历
    for (int i = 0; i < source.length; i++) {
        //目标字符串遍历
        for (int j = 0; j < target.length; j++) {
            //关键在于这句 从主串中取值 当i确定时 需要加上j来往后挪动位置 不相等就直接break
            if ([source characterAtIndex:i + j] != [target characterAtIndex:j]) {
                break;
            }
            //当索引到了字符串最后一个字符时就证明匹配成功
            if (j == target.length -1) {
                return i;
            }
        }
    }
    return -1;
}

BF算法代码实现方式2

一般来说我们都用这种方式来实现,因为上面这种有些人可能不是很能接受

/**
 暴力匹配字符解法2

 @param source 原字符串
 @param target 匹配字符串
 @return 成功返回索引 失败返回-1
 */
- (int)bruteForce2WithSource:(NSString *)source target:(NSString *)target {
    //主串索引
    int i = 0;
    //字串索引
    int j = 0;
    while (i < source.length && j < target.length) {
        //依次来一个一个对比
        if ([source characterAtIndex:i] == [target characterAtIndex:j]) {
            i++;
            j++;
        }else {//索引回溯 i的索引变化为下一个也就是 (i- j +1)而j = 0从头开始
            i = i - j + 1;
            j = 0;
        }
    }
    
    //到这一步 判断如果j == 字符串长度证明匹配成功
    if (j == target.length ) {
        return i - j;
    }
    return -1;
}

BF存在的问题和下篇预告

很明显我们可以看到BF算法是存在很大缺陷的,因为有些情况我们根本不需要从头来开始去匹配 例如:

使用OC写算法之BF算法_第1张图片
image.png

很明显我们下一次匹配的位置应该是下图这样:

使用OC写算法之BF算法_第2张图片
image.png

而不是从B开始 ,大牛们是无法忍受“暴力破解”这种低效的手段的,于是就有三个大牛一起研究出了我下篇文章要讲的KMP算法,so,下篇文章见。

你可能感兴趣的:(使用OC写算法之BF算法)