【优选算法】(第二十九篇)

目录

判断是否互为字符重排(easy)

题目解析

讲解算法原理

编写代码

存在重复元素I(easy)

题目解析

讲解算法原理

编写代码


判断是否互为字符重排(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定两个字符串 s1 和 s2 ,请编写⼀个程序,确定其中⼀个字符串的字符重新排列后,能否变成另⼀个字符串。
⽰例1:
输⼊: s1 = "abc", s2 = "bca"
输出: true
⽰例2:
输⼊: s1 = "abc", s2 = "bad"
输出: false

讲解算法原理

解法(哈希表):
算法思路:

1. 当两个字符串的⻓度不相等的时候,是不可能构成互相重排的,直接返回 false ;2. 如果两个字符串能够构成互相重排,那么每个字符串中「各个字符」出现的「次数」⼀定是相同
的。因此,我们可以分别统计出这两个字符串中各个字符出现的次数,然后逐个⽐较是否相等即可。这样的话,我们就可以选择「哈希表」来统计字符串中字符出现的次数。

编写代码

c++算法代码:

class Solution
{
public:
 bool CheckPermutation(string s1, string s2) 
 {
 if(s1.size() != s2.size()) return false;
 int hash[26] = { 0 };
 // 先统计第⼀个字符串的信息
 for(auto ch : s1)
 hash[ch - 'a']++;
 
 // 扫描第⼆个字符串,看看是否能重排
 for(auto ch : s2)
 {
 hash[ch - 'a']--;
 if(hash[ch - 'a'] < 0) return false;
 }
 return true;
 }
};

java算法代码:

class Solution
{
 public boolean CheckPermutation(String s1, String s2) 
 {
 if(s1.length() != s2.length()) return false;
 int[] hash = new int[26];
 // 先把第⼀个字符串的信息统计到哈希表中
 for(int i = 0; i < s1.length(); i++)
 {
 hash[s1.charAt(i) - 'a']++;
 }
 // 遍历第⼆个字符串,判断是否可以重排
 for(int i = 0; i < s2.length(); i++)
 {
 hash[s2.charAt(i) - 'a']--;
 if(hash[s2.charAt(i) - 'a'] < 0) return false;
 }
 return true;
 }
}

 

存在重复元素I(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个整数数组nums。如果任⼀值在数组中出现⾄少两次,返回true;如果数组中每个元素互不相同,返回false。
⽰例1:
输⼊:nums=[1,2,3,1]输出:true
⽰例2:
输⼊:nums=[1,2,3,4]输出:false

讲解算法原理

解法(哈希表):

算法思路:
分析⼀下题⽬,出现「⾄少两次」的意思就是数组中存在着重复的元素,因此我们可以⽆需统计元素出现的数⽬。仅需在遍历数组的过程中,检查当前元素「是否在之前已经出现过」即可。
因此我们可以利⽤哈希表,仅需存储数「组内的元素」。在遍历数组的时候,⼀边检查哈希表中是否已经出现过当前元素,⼀边将元素加⼊到哈希表中。

编写代码

c++算法代码:

class Solution
{
public:
 bool containsDuplicate(vector<int>& nums) 
 {
 unordered_set<int> hash;
 for(auto x : nums)
 if(hash.count(x)) return true;
 else hash.insert(x);
 return false;
 }
};

java算法代码:

class Solution
{
 public boolean containsDuplicate(int[] nums) 
 {
 Set<Integer> hash = new HashSet<>();
 for(int x : nums)
 {
 if(hash.contains(x)) return true;
 hash.add(x);
 }
 return false;
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值