讲解Leetcode第242题:有效的字母异位词

讲解Leetcode第242题:有效的字母异位词

题目介绍

输入:s=“anagram”,t=“nagaram”

输出:true

解释:字符串s和t由相同的字符组成,但是字符出现的顺序不同,故字符串s和t互为字母异位词


方法—:排序

完整代码展示

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

class Solution
{
public:
	bool isAnagram(string s, string t)
	{
		if (s.length() != t.length())
		{
			return false;
		}
		else
		{
			sort(s.begin(), s.end());
			sort(t.begin(), t.end());
			return s == t;
		}
	}
};


int main()
{
	string s = "aabc", t = "acba";

	Solution judge;
	bool result = judge.isAnagram(s, t);

	if (result)
	{
		cout << "s和t互为字母异位词" << endl;
	}
	else
	{
		cout << "s和t不互为字母异位词" << endl;
	}
	return 0;
}

代码片段解释

片段—:

#include <string>
#include <algorithm>
  • string头文件是C++标准库的一部分,它定义了一个string类,这是一个用于处理字符串的模板类。

通过使用string你可以方便地对字符串进行操作,而不需要手动管理字符串的内存。

  • algorithm头文件也是C++标准库的一部分,他提供了一系列通用的模板函数(算法函数)。

这些函数可以对容器中的元素进行操作。

片段二:

if (s.length() != t.length())
    
sort(s.begin(), s.end());

s.length()返回字符串s的长度。 (即s中包含的字符数)

s.begin()返回一个指向字符串s的第一个字符的迭代器。(返回的迭代器也可以被视为指向s[0]的指针)

s.end()返回一个指向字符串s的“尾后”位置的迭代器。 (这是一个不存在的虚假位置,指向最后一个字符之后的位置)

片段三:

return s == t;

使用==运算符来比较字符串s、t是否相等,相等返回true,不相等返回false。


方法二:哈希表

完整代码展示

#include<iostream>
#include<vector>
#include <string>
using namespace std;

class Solution
{
public:
	bool isAnagram(string s, string t)
	{
		if (s.length() != t.length())
		{
			return false;
		}
		else
		{
			vector<int>table(26, 0);
			for (auto& ch : s)
			{
				table[ch - 'a']++;
			}
			for (auto& ch : t)
			{
				table[ch - 'a']--;
				if (table[ch - 'a'] < 0)
				{
					return false;
				}
			}
			return true;
		}
	}
};

int main()
{
	string s = "aabc", t = "acba";

	Solution judge;
	bool result = judge.isAnagram(s, t);

	if (result)
	{
		cout << "s和t是字母异位词" << endl;
	}
	else
	{
		cout << "s和t不是字母异位词" << endl;
	}
	return 0;
}

核心原理演示

输入:s=“aabc”,t=“acba”

在这里插入图片描述

输出:true

代码片段解释

片段—:

vector<int>table(26, 0);

语法:这里创建了一个整型向量容器table,创建的同时并对其进行初始化:用26个数字0进行初始化

目的:用于记录26个小写字母在字符串s中出现的次数。

片段二:

for (auto& ch : s)
for (auto& ch : t)

auto& ch:表示自动推断变量ch的类型。

for(declaration : container)
{
    //循环体
}

这是C++11中引入的基于范围的for循环。这种循环方式可以简洁地遍历容器中的所有元素。

  • declaration:定义了一个变量,该变量在每次循环中都会被赋予容器的下一个元素。
  • container:要遍历的容器,它可以是任何提供了begin()和end()方法的容器。

故,for (auto& ch : s)与for (auto& ch : t)分别用于遍历字符串s和t中的每一个字符。

补充基于范围的for循环的其他语法形式

  • 值语义:
for (auto& element : container)
{
    // 使用引用避免拷贝
}
  • 常量型:
for (const auto& element : container)
{
    //不能修改element,因为它是const引用
}

片段三:

table[ch - 'a']++;
table[ch - 'a']--;

将字符串s,t中的每一个字符映射的向量容器中,即数组中:

  • ch - 'a'作为数组的索引。
  • table[ch - 'a']作为数组的值。
  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值