【第18题】给定一个字符串,判定是否是C语言合法标识符 | ASCII 码的应用
文章目录
主要知识点
字符的应用,ASCII 码的理解
习题
1. Leetcode 面试题 01.01. 判定字符是否唯一
题目描述
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
初见
确定字符串中的字符是否完全不同,即每个字符只出现一次。使用哈希表,遍历字符串统计字符数量,若某字符数量超过 1,则返回 false
,否则返回 true
:
代码
class Solution {
public:
bool isUnique(string astr) {
unordered_map<char, int> cmap;
for (auto ch: astr) {
cmap[ch]++;
if (cmap[ch] > 1) {
return false;
}
}
return true;
}
};
当然,上面使用了额外的数据结构。由 ascii 码的特性,可以使用一个长度为 128 的数组做哈希操作;若题目明确说明字符串中只有字符,则可以用 int
中的每一位表示某个字母是否出现。
2. Leetcode 剑指 Offer 50. 第一个只出现一次的字符
题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
初见
由于 s 只包含小写字母,因此可以用长度为 26 的数组做哈希操作。遍历字符串统计字母出现次数后,再次遍历字符串从哈希表中查找字母出现次数,找到第一个出现次数为 1 的字母即为答案,否则返回空字符:
代码
class Solution {
public:
char firstUniqChar(string s) {
char result = ' ';
int mCh[26]{0}; // 只包含小写字母
for (auto ch: s) { // 构造哈希表
mCh[ch - 'a']++;
}
for (auto ch: s) { // 找到第一个出现次数为 1 的字符
if (mCh[ch - 'a'] == 1) {
result = ch;
break;
}
}
return result;
}
};
3. Leetcode 383. 赎金信
题目描述
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成
初见
可以先遍历 magazine 构造字典,存储对应字符与可用数量。之后遍历 ransomNote 从字典中取出相应字符,当字典中字符可用数量不足(<0)时,返回 false,否则返回 true。由于两个字符串均只包含小写字母,因此与上一题一样,可以选择长度为 26 的数组做哈希操作:
代码
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int mCmap[26]{0}; // 全为小写字母
// 构造字典
for (auto ch: magazine) {
mCmap[ch - 'a']++;
}
// 从字典中取出相应字母
for (auto ch: ransomNote) {
mCmap[ch - 'a']--;
if (mCmap[ch - 'a'] < 0) { // 字符数量不够则返回 false
return false;
}
}
return true;
}
};
总结
- 经过 5 月训练,再看 C++ 入门有很多题目已经变简单了
- 中间暂时差的几个例题由于很简单,因此暂时不会补上