Java解法:
方法一:我们可以使用一个HashSet来存储已经遍历过的字符,如果遍历到的字符已经存在于HashSet中,则说明字符串中有重复字符,返回false;否则,将字符加入HashSet中。最后,如果遍历完字符串仍然没有发现重复字符,则返回true。
Java代码实现如下:
class Solution {
public boolean isUnique(String s) {
HashSet<Character> set = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (set.contains(c)) {
return false;
}
set.add(c);
}
return true;
}
}
方法二:如果不使用额外的数据结构,可以使用位运算来解决。我们可以使用一个整数来表示26个小写字母,每一位代表一个字母是否出现过。初始时,整数为0,表示没有字母出现过。遍历字符串中的每个字符,计算出字符与 ‘a’ 的差值,然后将1左移差值位,得到一个只有对应字母位为1的整数。将这个整数与之前的整数进行与运算,如果结果不为0,则说明该字母之前已经出现过,返回false;否则,将之前的整数与该整数进行或运算,表示该字母已经出现过。最后,如果遍历完字符串仍然没有发现重复字符,则返回true。
Java代码实现如下:
public class Solution {
public boolean isUnique(String s) {
int bitmap = 0;
for (int i = 0; i < s.length(); i++) {
int diff = s.charAt(i) - 'a';
int bit = 1 << diff;
if ((bitmap & bit) != 0) {
return false;
}
bitmap |= bit;
}
return true;
}
}
C++解法
上述是简化后的算法场景,对于实际开发应缜密考虑更多实际情况进行if判断