Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述:
一起来打卡: 判定字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode" 输出: false
示例 2:
输入: s = "abc" 输出: true
0 <= len(s) <= 100 如果你不使用额外的数据结构,会很加分。
二、思路分析:
这道题是一道简单题,判断字符串是否有重复字符,根据题目要求,我们不能使用set等数据结构去重,我们可以使用数组去重,创建一个大小为52的数组,初始值都为0,。遍历字符串,利用字符的ASCII码表对应下标,把大写字母对应到0-25的下标,比如字符A,ascill码为65,那么就使用65-A得到0,同理B为1,小写字母对应到26-51下标,对应下标的值+1。
如果+1后对应值大于1,说明该字符重复出现,返回false。
三、AC 代码:
class Solution {
public boolean isUnique(String astr) {
int[] ch = new int[52];
for(int i=0; i<astr.length(); i++){
char c = astr.charAt(i);
if(c>='A' && c<='Z'){
ch[c-65]++;
if(ch[65-c]>1)
return false;
}else if(c>='a' && c<='z'){
ch[c-97+26]++;
if(ch[c-97+26]>1)
return false;
}
}
return true;
}
}
执行结果: 通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:38.6 MB, 在所有 Java 提交中击败了37.49%的用户 通过测试用例: 17 / 17
四、总结:
该题没有明确的字符范围,所以我这解题只适用于只含有大小写英文字母的字符串,由于ASCII码表总共有128个字符,所以可以创建一个大小为128的数组,一样采用下标对应即可。
评论区大佬的解题思路是使用位运算,我的理解是bitmap数据结构,将字符对应到一个数的每一位上,字符的ASCII码对应的十进制是不变的,所以做位运算的时候,如果字符对应的位上已经置为1了就重复了。