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;
}

提交结果截图

相关推荐
这个DBA有点耶5 分钟前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康10 分钟前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_00212 分钟前
C++11(一)
开发语言·c++·算法
529宝宝起名网21 分钟前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
未来之窗软件服务31 分钟前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
Wang's Blog33 分钟前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登1 小时前
01_Java基础速通
java·开发语言
前端炒粉1 小时前
DOM 常用 API 速查表
开发语言·javascript·ecmascript
带多刺的玫瑰2 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode
en.en..2 小时前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法