字符串模式匹配

本文探讨如何判断字符串中的非空单词是否能与给定模式进行一一对应。通过将字符串拆分成单词列表,当列表长度与模式长度不一致时直接返回false。接着使用双指针遍历模式和单词列表,若每次匹配一致则返回true,否则返回false。文中提供多个示例以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于特定的模式pattern以及特定的字符串str,判断str中的非空单词是否能和pattern中的字符一一对应,注意这里的一一对应是双向的。
示例1:
输入:
“effe”,“good bad bad good”
输出:
true

示例2:
输入:“effe”,“good bad bad not” 输出:false
输入:“efff”,“good bab bad bad bad” 输出:false

解题步骤:先将字符串差分成多个单词,存放至list中
list长度和pattern.length()长度不一致的,首先排除 为false
通过双指针 遍历模式pattern与单词list,每次匹配结果一致 即为true,否则为false
public boolean testMatch(String pattern, String str){
    List<StringBuilder> wordList = splitStr(str);
    //注意i最大为length()-1
    for (int i = 0; i < pattern.length() - 1 ; i++) {
        //模式不匹配的话 返回false
        if ((pattern.charAt(i) == pattern.charAt(i+1)) != isEquals(wordList, i)){
            return false;
        }
    }

    return true;

}

//先将字符串分割为多个单词
private List<StringBuilder> splitStr(String str){
    List<StringBuilder> list = new ArrayList<>();
    if (str == null || str.length() == 0) return list;
    int index = 0;
    int length = str.length();

    while(index < length){
        StringBuilder word = new StringBuilder();
        while (index < length && str.charAt(index) != ' '){
            word.append(str.charAt(index));
            index++;
            if (index == length){
                break;
            }
        }
        list.add(word);
        index++;
    }

    return list;
}

//查看两个单词是否相等
private boolean isEquals(List<StringBuilder> wordList, int beginIndex){
    return wordList.get(beginIndex).toString().equals(wordList.get(beginIndex + 1).toString());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值