题目描述
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
import java.util.*; public class Different {
public boolean checkDifferent(String iniString) {
// write code here
for (int l = 0; l < iniString.length(); l++) {
for (int i = iniString.length()-1; i > l; i--) {
// System.out.print(iniString.charAt(0));
// System.out.print(iniString.charAt(i));
if (iniString.charAt(l) == iniString.charAt(i)) {
return false;
}
}
}
return true;
}
}
个人解题思路
题意是字符串中只要有重复的就返回false,重复就意味着有比较,
这里采用双重for循环,定义两个点一个从前往后一个从后往前,将所有的都比较一遍后将结果返回,若是有相等则直接返回false。
效率:(运行时间23ms 占用内存9680k)
public static boolean checkDifferent2(String iniString) {
HashSet<Character> hashSet = new HashSet<Character>();
char[] charArray = iniString.toCharArray();
for(char ch:charArray) {
hashSet.add(ch);
}
if(hashSet.size()==charArray.length) {
return true;
}
return false;
}
通过set集合实现,利用set的不重复性
将String中每一个char字符存入set集合中比较set集合与char集合的长度,相等就说明无重
效率:(运行时间:44ms 占用内存11348k)
暂时想到这两种解题思路,如果有效率更高的欢迎交流,注:效率由牛客网提供的,多测了几次不是特别准确,时间复杂度空间复杂度菜鸟猪还没弄明白。
刚刚又想到一种补充下使用字符串的 indexOf()和lastIndexOf()
上代码
public static boolean checkDifferent4(String iniString) { for (int i = 0; i < iniString.length(); i++) {
if(iniString.lastIndexOf(iniString.charAt(i))!=i) {
return false;
}
}
return true;
}
解题思路是这样的
通过循环用lastIndexOf()方法返回该元素最后一次出现的下标(猪从前往后循环的所以用最后一次出现的位置)与当前元素的下标做比较,如果不相同不用继续了,说明肯定有重复的
之前没想到indexof()方法。
效率:(运行时间:23ms 占用内存9676k)
这是这道题的三种思路,欢迎补充!转载请说明地址,谢谢!