LeetCode:Word Pattern - 字符串模式匹配

本文详细介绍了 LeetCode 290 题目“WordPattern”的解决方案,包括两种使用 HashMap 实现的方法。这两种方法分别通过直接映射检查和利用 put 函数特性来判断字符串是否符合给定的模式。

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

1、题目名称

Word Pattern(字符串模式匹配)

2、题目地址

https://leetcode.com/problems/word-pattern/

3、题目内容

英文:Given a pattern and a string str, find if str follows the same pattern.

中文:给出一组模式(pattern)和一个字符串(str),查看字符串是否与模式匹配

例如:

  1. pattern = "abba",str = "dog cat cat dog",返回真

  2. pattern = "abba",str = "dog cat cat fish",返回假

  3. pattern = "aaaa",str = "dog cat cat dog",返回假

  4. pattern = "abba",str = "dog dog dog dog",返回假

注意:

模式仅有小写字母构成,字符串被单个空格字符隔开,字符串中每个单词都由小写字母构成;模式和字符串的前后都不包含多余的空格;模式中的每个字母必须匹配一个字符串中长度至少为1的单词。

4、解题方法1

使用HashMap可以很方便地解决本问题。

需要注意的是,模式中的两个不同的字符,不能对应字符串中相同的单词。

Java代码如下:

import java.util.HashMap;

/**
 * @功能说明:LeetCode 290 - Word Pattern
 * @开发人员:Tsybius2014
 * @开发时间:2015年10月9日
 */
public class Solution {
    
    /**
     * 字符串模式匹配
     * @param pattern
     * @param str
     * @return
     */
    public boolean wordPattern(String pattern, String str) {
        
        if (pattern.isEmpty() || str.isEmpty()) {
            return false;
        }
        
        String[] s = str.split(" ");
        if (s.length != pattern.length()) {
            return false;
        }
        
        HashMap<Character, String> hashMap = new HashMap<Character, String>();
        for (int i = 0; i < pattern.length(); i++) {
            if (hashMap.containsKey(pattern.charAt(i))) {
                if (!hashMap.get(pattern.charAt(i)).equals(s[i])) {
                    return false;
                }
            } else if (hashMap.containsValue(s[i])) {
                return false;
            } else {
                hashMap.put(pattern.charAt(i), s[i]);
            }
        }
        
        return true;
    }
}

5、解题方法2

另一个办法需要利用HashMap中put函数的性质。

put函数的声明如下:

public V put(K key, V value)

它的功能是将键值对存入map中,如果map中原本就包含要插入的键,将旧值替换为新值。对于该函数的返回值,如果要插入的键在字典中不存在,则返回null,否则返回替换前的值。根据put函数的性质,可以作出如下Java代码:

import java.util.HashMap;
import java.util.Objects;

/**
 * @功能说明:LeetCode 290 - Word Pattern
 * @开发人员:Tsybius2014
 * @开发时间:2015年10月9日
 */
public class Solution {
    
    /**
     * 模式匹配
     * @param pattern
     * @param str
     * @return
     */
    public boolean wordPattern(String pattern, String str) {
        
        if (pattern.isEmpty() || str.isEmpty()) {
            return false;
        }
        
        String[] s = str.split(" ");
        if (s.length != pattern.length()) {
            return false;
        }
        
        @SuppressWarnings("rawtypes")
        HashMap<Comparable, Integer> hashMap = new HashMap<Comparable, Integer>();
        for (int i = 0; i < pattern.length(); i++) {
            if (!Objects.equals(hashMap.put(pattern.charAt(i), i), hashMap.put(s[i], i)))
                return false;
        }
        
        return true;
    }
}

END

转载于:https://my.oschina.net/Tsybius2014/blog/514983

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值