题目链接:https://leetcode-cn.com/problems/verifying-an-alien-dictionary/
题目分析:由题目给定字符的大小等级,依照此等级比较字符串大小。
解题思路:定义一个数组order_rank[26]
,给定某个字符c
, order_rank['a' - c]
表示该字符在order中的位置。
错误记录:程序第32
行,原本写作:while (words1[idx] == words2[idx])
,这样的写法无法满足两个字符串相等的情况(即两个字符串每个字符都相等,包括最后的\0
符号也相等,产生了溢出,理论上循环将在字符串后的某个位置上停止。
更正:循环中判断两个字符的终止,改为while (words1[idx] == words2[idx] && words1[idx] != '\0' && words2[idx] != '\0')
。
AC代码:
class Solution {
public:
int order_rank[26];
bool isAlienSorted(vector<string>& words, string order) {
vector<string>::iterator ite;
bool ret = true;
set_rank(order); // 设置order_rank数组
for (ite = words.begin(); ite != words.end(); ++ite) // 两两对比
{
if (ite != words.end() - 1)
{
if (cmp(*ite, *(ite + 1)) > 0) // cmp返回正数,前者比后者大
{
ret = false;
break;
}
}
}
return ret;
}
void set_rank(string order)
{
int idx = 0;
for (idx = 0; idx < 26; ++idx)
{
order_rank[order[idx] - 'a'] = idx; // 得到每个字母的顺序,rank越小,出现越早,等级越低
}
}
int cmp(string words1, string words2) {
int idx = 0;
while (words1[idx] == words2[idx] && words1[idx] != '\0' && words2[idx] != '\0')
{
++idx;
}
// 循环结束,word1[idx] != words2[idx]
// 分三种情况
if (words1[idx] == '\0') // words1到达末尾
{
if (words2[idx] == '\0')
return 0;
else
return -1; // word1 < words2
}
else if (words2[idx] == '\0') // words2 到达末尾
{
return 1; // word1 > words2
}
else // 出现不相等,比较两者字符的rank,越低的越小
return order_rank[words1[idx] - 'a'] - order_rank[words2[idx] - 'a'];
// words1[idx]的rank更小,返回负数
}
};