题目描述

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

给定一个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)

这是这道题的三种思路,欢迎补充!转载请说明地址,谢谢!

版权声明:本文为youknow-zx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/youknow-zx/p/11418766.html