代码编织梦想

题目描述

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

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

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

题目分析

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

代码

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

提交结果截图

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/apprentice_eye/article/details/136093481

【LeetCode】290. Word Pattern 单词规律(Easy)(JAVA)-爱代码爱编程

【LeetCode】290. Word Pattern 单词规律(Easy)(JAVA) 题目地址: https://leetcode.com/problems/word-pattern/ 题目描述: Given a pattern and a string s, find if s follows the same pattern. Here f

【LeetCode】290. Word Pattern 单词规律(Easy)(JAVA)每日一题-爱代码爱编程

【LeetCode】290. Word Pattern 单词规律(Easy)(JAVA) 题目地址: https://leetcode.com/problems/word-pattern/ 题目描述: Given a pattern and a string s, find if s follows the same pattern. Here f

290. word pattern 单词规律-爱代码爱编程

包含字母的字符串a和包含单词空格的字符串b内字母和单词间的映射 输入: pattern = “abba”, str = “dog cat cat dog” 输出: true //在一个map中存取key获取value来进行比较 class Solution { public boolean wordPattern(String pattern,

290. 单词规律(javascript) 290. Word Pattern-爱代码爱编程

leetcode题目来源:https://leetcode-cn.com/problems/word-pattern/ 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。 Given a patt

算法训练营day22, 回溯2-爱代码爱编程

216. 组合总和 III func combinationSum3(k int, n int) [][]int {   //存储全部集合   result := make([][]int, 0)   //存储单次集合   path := make([]int, 0)   var backtrace func(k int, n int, s

基础数学问题整理-爱代码爱编程

    最近刷了一些关于基础数学问题的题目,大致是关于组合数、分解质因数还有一些思维题,题目来自洛谷的【数学1】基础数学问题 - 题单 - 洛谷,很多思路还是之前没有见过的,都是简单到一般难度的题目(橙、题、绿题),特别做个整理。 目录 组合数问题 编号 组合数问题  分解质因数 Hankson 的趣味题 细胞分裂  思维题

java-爱代码爱编程

目录  一.  二分查找(递归): 代码详解: 运行结果: 二分查找优化: 优化代码:  运行结果(返回对应查找数字的下标集合):  ​编辑  二分查找(非递归): 二. 插值查找  代码详解: 运行结果:  三. 斐波那契[黄金分割查找] 代码详解:  运行结果:  一.  二分查找(递归): 前提条件: 所要

【nicn的刷题日常】之打印整数二进制的奇数位和偶数位-爱代码爱编程

  目录 1.题目描述  2.解题思路  3.解题     1.题目描述  获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 2.解题思路  1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0 2. 以同样的方式提取偶数位置  检测num中某一位是0还是1的方式:    1. 将num

力扣344-爱代码爱编程

反转字符串 题目链接 解题思路 双指针算法两个指针向中间靠拢,直至相遇交换两个指针的值 class Solution { public: void reverseString(vector<

(52)只出现一次的数字iii-爱代码爱编程

文章目录 每日一言题目解题思路代码结语 每日一言 十年磨一剑,风雨未曾阻挡;愿你乘风破浪,不负韶华时光。 题目 题目链接:只出现一次的数字 给你一个整数数组 nums,其中恰好有两个元

【算法训练营】数字盒子,重编码,成绩排序(python实现)-爱代码爱编程

数字盒子 问题描述 你有一个盒子,你可以往里面放数,也可以从里面取出数。 初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类: 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。删除操作:询问盒子中是否存在数 x,如果存在则取出 x。 对于每个操作,你需要输出是否成功插入或删除。 输入格式

p1026 [noip2001 提高组] 统计单词个数-爱代码爱编程

题目传送门 题目描述 给出一个长度不超过 200 的由小写英文字母组成的字母串(该字串以每行 20 个字母的方式输入,且保证每行一定为 20 个)。要求将此字母串分成 k 份,且每份中包含的单词个数加起来总数最大。 每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串 this 中可包含 this 和 is,选用 thi

【leetcode 面试经典150题】290. word pattern 单词规律-爱代码爱编程

290. Word Pattern 题目大意 Given a pattern and a string s, find if s follows the same pattern. Here follow means