LeetCode 2 Word Pattern

模式匹配算法
本文介绍了一个纯C语言实现的模式匹配算法,该算法不使用额外的数据结构如哈希表或映射,而是通过巧妙利用字符串操作函数和数组实现模式匹配。文章详细解释了算法的工作原理,并给出了具体的例子。

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

Here follow means a full match, such that there is a bijection between a letter in pattern and a substring in str.

Examples:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. pattern = "abba", str = "dog dog dog dog" should return false.

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.


类似于模式匹配。题目应该算比较简单的。


没做出来。前期一直在指针数组折腾,后来才知道其实完全可以用C99定义的变长数组(一是对LeetCode的检测环境不熟,二是用渣渣VS2008用多了,MS这货直到VS2013才部分支持C99)。贴上代码:(VC6.0 VS2008 2010都不能通过,13未试,CLang和GCC可以)

bool wordPattern(char* pattern, char* str)
{
        int i, j, len = strlen(pattern);
        int search[len];
        char *token, *saveptr; char strtmp[strlen(str)];
        for(i = 0; i < len; i++) search[i] = -1;

        strcpy(strtmp, str);
        token = strtok_r(strtmp, " ", &saveptr);
        for(i = 0; i < len; i++)
        {
                int a = strchr(pattern, pattern[i]) - pattern;

                if(token == NULL) break;
                int b = strstr(str, token) - str;

                for(j = 0; j < a; j++)
                        if(search[j] == b) return false;
                if(search[a] == -1) search[a] = b;
                else if(search[a]!= b) return false;
                token = strtok_r(NULL, " ", &saveptr);
        }
        if((token == NULL) ^ (i== len)) return false;
}

这是discuss唯一能找到的C语言的回答,亮点多多。

一、其他的无论是C++或者JAVA,或多或少使用了map或者HasMap。C语言这个答案被人评论 Brave Enough! 因为纯算法。
二、strtok谁都知道,但是用了更安全的现成 strtok_r。另外使用strstr strchr两个函数来定位,另外使用了字符串减法(指针偏移量)。
三、search数组,这个和pattern一样大小的数组,初始化为-1,后面全是用它来判是否模式匹配。

算法思想(自己推测,如有不对请见谅):
       其实就是依次往下看第n个单词是否应该和前面某个单词匹配。search[i]指示了第i个单词应该匹配的起始位置(从0开始)
       算法中共有三个false条件,依次来看看。
       第一个判不匹配条件:if(search[j] == b) return false;
               因为b>=0,所以这个条件成立时,a > 0(不能等于0,a=0时进不了这个循环)。并且所要查询位置前面出现了不应有的匹配。
               例: abba | dog dog cat dog 查第二个单词的时候。
       第二个判不匹配条件 :if(search[a] != b) return false;
               很好理解,首先这一位不是-1,所以前面出现过,出现过就应该是同样的b值。就是应该匹配反而没匹配,退出。
               例:abba | dog cat dog cat 查第三个单词的时候。
       第三个判不匹配条件:if((token == NULL) ^ (i== len)) return false;
               两个条件异或为真时退出,即两者一真一假则退出。前面为真 字符串完了,但是pattern还有,不匹配;patter完了 字符串还有 不匹配。

### LeetCode290题:单词规律 #### 题目描述 给定一种 `pattern` (模式) 一个字符串 `s` ,判断 `s` 是否遵循相同模式。这里遵循的意思是一个完整的匹配,其中单个字母可以映射到 `s` 中的一个单词,但不能映射到两个不同的单词[^1]。 具体来说: - 模式中的每个字母表示 `s` 的一个单词。 - 不同的字母必须映射到不同的单词。 - 单词之间由格分隔。 如果存在这样的映射,则返回 true;否则返回 false。 #### 示例代码实现 以下是 Python 实现的一种方法: ```python def wordPattern(pattern: str, s: str) -> bool: words = s.split() if len(pattern) != len(words): return False char_to_word = {} word_to_char = {} for c, w in zip(pattern, words): if c not in char_to_word: if w in word_to_char: return False char_to_word[c] = w word_to_char[w] = c else: if char_to_word[c] != w: return False return True ``` 此算法通过构建双向映射来验证是否存在有效的字符到单词的一一对应关系。它的时间复杂度为 O(n),n 是 pattern 或者 s 的长度(取决于两者较短的那个)。间复杂度主要来源于存储字典的间需求,即 O(m),m 表示不同字符的数量加上不同单词的数量之[^2]。 #### 测试案例 测试该函数的一些例子如下所示: ```python print(wordPattern("abba", "dog cat cat dog")) # 输出: True print(wordPattern("abba", "dog cat cat fish")) # 输出: False print(wordPattern("aaaa", "dog cat cat dog")) # 输出: False print(wordPattern("abba", "dog dog dog dog")) # 输出: False ``` 以上展示了如何利用哈希表解决这个问题并提供了一个高效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值