首页 > 试题广场 >

字符串匹配问题

[编程题]字符串匹配问题
  • 热度指数:2491 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
对于字符串str,其中绝对不含有字符’.’和‘*’再给定字符串exp,其中可以含有’.’或’‘*’,’*’字符不能是exp的首字符,并且任意两个’*‘字符不相邻。exp中的’.’代表任何一个字符,exp中的’*’表示’*‘的前一个字符可以有0个或者多个。请写一个函数,判断str是否能被exp匹配(注意:输入的数据不保证合法,但只含小写字母和‘.’和‘*’)。

输入描述:
输入包含两行,两个字符串,分别代表str和exp


输出描述:
如果str是能被exp匹配,请输出“YES”,否则输出“NO”。
示例1

输入

abc
abc

输出

YES
示例2

输入

abcd
.*

输出

YES

备注:
时间复杂度,额外空间复杂度,(n为字符串str长度,m为字符串exp长度)

递归解法

import java.util.*;

public class Main {

    //isValid
    public static boolean isValid(char[] s, char[] e) {
        for(int i = 1; i < e.length; i++) {
            if (e[i] == '*' && e[i - 1] == '*')
                return false;
        }
        return true;
    }

    public static boolean judge(char[] s, char[] e, int si, int ei) {
        if (ei == e.length) {
            return si == s.length;
        }
        if (ei + 1 == e.length || e[ei + 1] != '*') {
            return si != s.length && (e[ei] == s[si] || e[ei] == '.')
                && judge(s, e, si + 1, ei + 1);
        }
        while (si != s.length && (e[ei] == s[si] || e[ei] == '.')) {
            if (judge(s, e, si, ei + 2)) {
                return true;
            }
            si ++;
        }
        return judge(s, e, si, ei + 2);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] s = sc.nextLine().toCharArray();
        char[] e = sc.nextLine().toCharArray();
        sc.close();
        if (!isValid(s, e)) {
            System.out.println("NO");
            return;
        }
        if (!judge(s, e, 0, 0)) {
            System.out.println("NO");
        } else {
            System.out.println("YES");
        }
    }
}

动态规划解法

import java.util.*;
public class Main {
    public static boolean isValid(char[] s, char[] e) {
        for (int i = 0; i < s.length; i++) {
            if (s[i] == '*' || s[i] == '.') {
                return false;
            }
        }
        for (int i = 0; i < e.length; i++) {
            if (e[i] == '*' && (i == 0 || e[i - 1] == '*')) {
                return false;
            }
        }
        return true;
    }
    public static boolean isMatchDP(String str, String exp) {
        if (str == null || exp == null) {
            return false;
        }
        char[] s = str.toCharArray();
        char[] e = exp.toCharArray();
        if (!isValid(s, e)) {
            return false;
        }
        boolean[][] dp = initDPMap(s, e);
        for (int i = s.length - 1; i > -1; i--) {
            for (int j = e.length - 2; j > -1; j--) {
                if(e[j + 1] != '*') {
                    dp[i][j] = (s[i] == e[j] || e[j] == '.') && dp[i + 1][j + 1];
                } else {
                    int si = i;
                    while (si != s.length && (s[si] == e[j] || e[j] == '.')) {
                        if (dp[si][j + 2]) {
                            dp[i][j] = true;
                            break;
                        }
                        si++;
                    }
                    if (dp[i][j] != true) {
                        dp[i][j] = dp[si][j + 2];
                    }
                }
            }
        }
        return dp[0][0];
    }
    public static boolean[][] initDPMap(char[] s, char[] e) {
        int slen = s.length;
        int elen = e.length;
        boolean[][] dp = new boolean[slen + 1][elen + 1];
        dp[slen][elen] = true;
        for (int j = elen - 2; j > -1; j -= 2) {
            if (e[j] != '*' && e[j + 1] == '*') {
                dp[slen][j] = true;
            } else {
                break;
            }
        }
        if (slen > 0 && elen > 0) {
            if ((e[elen - 1] == '.' || s[slen - 1] == e[elen - 1])) {
                dp[slen - 1][elen - 1] = true;
            }
        }
        return dp;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String exp = sc.nextLine();
        if (isMatchDP(str, exp)) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }
}
发表于 2020-05-25 10:26:54 回复(0)

问题信息

上传者:小小
难度:
1条回答 6414浏览

热门推荐

通过挑战的用户

查看代码