290. Word Pattern(单词规律)

题目描述

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

提示:

复制代码
1 <= pattern.length <= 300
pattern 只包含小写英文字母
1 <= s.length <= 3000
s 只包含小写英文字母和 ' '
s 不包含 任何前导或尾随对空格
s 中每个单词都被 单个空格 分隔

题目分析

首先判断pattern串的长度与s串的单词数是否相等,如果不相等那么这两个字符串的模式必然不一样,如果相等了在继续进行下一项的判断,因为总共有26个小写字母,所以我们可以利用字母的值为串的下标将单词存储起来,如果字母一样就检查当前单词是否出现过,如果没有出现过记录下来此单词,如果已经出现过了那么就将当前单词与已出现的单词作比较,如果相同那么目前的模式仍然一样。依次比对下去即可。

代码

c 复制代码
bool wordPattern(char* pattern, char* s) {
    char *x[26];
    for(int i=0; i<26; i++){
        x[i] = NULL;
    }
    int pattern_length = 0;
    while(pattern[pattern_length++]!='\0');
    pattern_length--;
    int k = 0;
    int count = 0;
    for(;s[k]!='\0'; k++){
        if(s[k]==' '){
            count++;
        }
    }
    if(k!=0){
        count++;
    }
    if(count!=pattern_length){
        return false;
    }
    int i=0; 
    int j=0;
    for(i=0; pattern[i]!='\0'; i++){
        int length_word = 0;
        if(x[pattern[i]-'a']==NULL){
            while(s[j+length_word]!=' '&&s[j+length_word]!='\0'){
                length_word++;
            }
            x[pattern[i]-'a'] = (char *)malloc(sizeof(char)*(length_word+1));
            for(int k=0; k<length_word; k++){
                x[pattern[i]-'a'][k] = s[j+k];
            }
            x[pattern[i]-'a'][length_word] = '\0';
            j = j + length_word+1;   
        }else{
            char *y = NULL;
             while(s[j+length_word]!=' '&&s[j+length_word]!='\0'){
                length_word++;
            }
            y = (char *)malloc(sizeof(char)*(length_word+1));
            for(int k=0; k<length_word; k++){
                y[k] = s[j+k];
            }
            y[length_word] = '\0';
            j = j + length_word+1;
            if(strcmp(x[pattern[i]-'a'], y)){
            	return false;
			}
        }
    }
    for(int i=0; i<26; i++){
    	for(int j=i+1; j<26; j++){
			if(x[i]!=NULL&&x[j]!=NULL){
				if(!strcmp(x[i], x[j])){
					return false;
				}
			}
		}
	}
    return true;
}

提交结果截图

相关推荐
renhongxia13 分钟前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了3 分钟前
数据结构之树(Java实现)
java·算法
算法备案代理6 分钟前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
Monly216 分钟前
Java:修改打包配置文件
java·开发语言
我命由我1234528 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
赛姐在努力.30 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
island131436 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
xcLeigh1 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh1 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
秋邱1 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python