字符匹配问题-暴力匹配法

问题背景

有一个字符串 s t r 1 = " w h e l l str1 = "whell str1="whell h e l l o " hello" hello",和一个字符子串 s t r 2 = " h e l l o " str2 = "hello" str2="hello"
判断 s t r 1 str1 str1中是否含有 s t r 2 str2 str2,如果存在,就返回第一次出现的位置,如果没有,则返回 − 1 -1 1

思路分析

  1. 将两个字符串转为 c h a r char char数组
  2. 定义两个变量 i , j i,j i,j遍历 s t r 1 str1 str1 s t r 2 str2 str2
  3. 如果两个数组的元素匹配,即 s t r 1 [ i ] = = s t r 2 [ j ] str1[i] == str2[j] str1[i]==str2[j],则 i + + , j + + i++,j++ i++,j++,继续匹配
  4. 如果两个数组的元素不匹配,即 s t r 1 [ i ] ! = s t r 2 [ j ] , str1[i] != str2[j], str1[i]!=str2[j] i = i − j + 1 ; j = 0 , i= i-j+1;j=0, i=ij+1;j=0,继续匹配。
  5. 如果两个数组中的任意个索引到达边界则停止匹配;
    5.1 s t r 1 str1 str1到达边界:元素遍历完了:匹配成功/未成功
    5.1 s t r 2 str2 str2到达边界:元素遍历完了:匹配成功。
  6. 判断是否匹配成功:检查j是不是到达了 s t r 2 str2 str2的边界
    如果到达边界 返回 i − j i-j ij:即字符串出现的初始位置
    如果位到达边界,返回 − 1 -1 1

可以用遍历的思路

索引 i012345678910
str1whellhello
索引 j01234
str2hello

第1步:
在这里插入图片描述
第2步:
在这里插入图片描述
第3步:
在这里插入图片描述
第4步:
在这里插入图片描述
第5步:
在这里插入图片描述
第6步:
在这里插入图片描述
第7步:
在这里插入图片描述

java代码

package kmp;

public class ViolenceMatch {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //测试暴力匹配算法
        String str1 = "hello word hello";
        String str2 = "word";
        int index = violenceMatch(str1,str2);
        System.out.println("index="+index);

    }
    
    //暴力匹配算法实现
    public static int violenceMatch(String str1,String str2){
        //将两个字符串转为char数组
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();

        //获取两个char数组的长度
        int s1Len = s1.length;
        int s2Len = s2.length;

        //定义两个索引,分别指向两个数组
        int i = 0; //i索引指向s1
        int j = 0;//j索引指向s2

        //在两个索引范围内移动两个索引
        while(i<s1Len && j<s2Len){//保证匹配时,不越界
            if(s1[i] == s2[j]){//匹配ok,两个索引都向后移动一位
                i++;
                j++;
            }else{//没有匹配成功
                //如果失败,i在上次的初始索引的基础上往后移动一位。
                i= i-(j-1);//往后移动一位
                j=j-j;
            }
        }
        //判断是否匹配成功//匹配成功,j会移动到数组长度的下一位,即j==s2Len
        if(j == s2Len){
            return i-j; //返回第一个数组匹配成功的起始索引
        }else{
            return -1;//没有匹配成功,返回-1
        }
    }
}

思考

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BF算(Brute-Force算),也称为朴素匹配,是一种简单直观的字符匹配。它的基本思想是从主串的第一个字符开始,依次与模式串的每个字符进行比较,如果匹配成功,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。这个过程类似于暴力破解密码的过程,因此也被称为暴力匹配。 下面是BF算的C语言实现: ```c #include <stdio.h> #include <string.h> int BF(char* s, char* p) { int i = 0, j = 0; int s_len = strlen(s); int p_len = strlen(p); while (i < s_len && j < p_len) { if (s[i] == p[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j == p_len) { return i - j; } else { return -1; } } int main() { char s[] = "hello world"; char p[] = "world"; int pos = BF(s, p); if (pos != -1) { printf("匹配成功,位置为:%d\n", pos); } else { printf("匹配失败\n"); } return 0; } ``` 在上面的代码中,BF函数接受两个参数,分别是主串s和模式串p。在函数中,我们使用两个指针i和j分别指向主串和模式串的第一个字符,然后依次比较它们的字符是否相等。如果相等,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。如果模式串匹配成功,则返回匹配的位置,否则返回-1。 需要注意的是,BF算的时间复杂度为O(m*n),其中m和n分别为主串和模式串的长度。因此,当主串和模式串的长度较大时,BF算的效率会比较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值