LeetCode 单词模式

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。

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

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
思路分析:此题就是将pattern中的字符与str中对应顺序的单词匹配关联,并且将str中的单词与pattern中对应顺序的字符关联。
请翻阅 LeetCode 同构字符串
与上一题基本相同,就是一个是字符之间的关联,一个是字符与字符串之间的关联。

class Solution {
public:
	bool wordPattern(string pattern, string str) {
		vector<string> vs = split(str, ' ');//对str串,以空格为分割字符进行分割
		vector<char> vc;//将pattern的个字符复制
		for (auto & i : pattern){
			vc.push_back(i);
		}
		//如果两个匹配的容器长度相同
		if (vc.size() != vs.size())
			return false;
		unordered_map<char, string> patternToStr;//pattern中的字符匹配str中的单词
		unordered_map<string, char> strToPattern;//str中的字符匹配pattern中的单词
		auto it1 = vc.begin();
		auto it2 = vs.begin();
		//开始匹配
		while (it1 != vc.end() && it2 != vs.end()){
			if (patternToStr.find(*it1) != patternToStr.end() || strToPattern.find(*it2) != strToPattern.end()){
				if (patternToStr[*it1] != *it2 || strToPattern[*it2] != *it1) {
					return false;
				}
			}
			else{
				//互相标记
				patternToStr[*it1] = *it2;
				strToPattern[*it2] = *it1;
			}
			it1++;
			it2++;
		}
		return true;
	}
	//对str串进行分割,ch为分割字符
	vector<string> split(string str, char ch) {
		vector<string> resVec;
		int strSize = str.size(), index = 0;
		//扫描字符串str,每遇到ch字符就分割
		while (index < strSize) {
			string tempStr = "";//截取上一个ch(或者起始端)到下一个ch(或者尾端)之间的字符段
			while (index < strSize && str[index] != ch) {
				tempStr += str[index++];
			}
			resVec.push_back(tempStr);
			index += 1;
		}
		return resVec;
	}
};

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值