首页 > 其他分享 >判断字符串是否唯一

判断字符串是否唯一

时间:2024-04-02 16:23:05浏览次数:21  
标签:字符 判断 HashSet 重复 复杂度 唯一 字符串 astr

算法1:用于判断一个字符串的字符是否都是唯一的,即没有重复的字符。

解决思路:首先将输入的字符串转换为字符数组,然后对字符数组进行排序。之后,使用一个while循环遍历排序后的字符数组,如果发现有任何两个相邻的字符相同,则返回false,表示字符串中有重复的字符。如果循环结束后都没有发现相邻的字符相同,则返回true,表示字符串中的字符都是唯一的。

代码示例:

 public boolean isUnique(String astr) {
        char[] chars = astr.toCharArray();
        Arrays.sort(chars);
        int i=0;
        while(i<chars.length-1){
            if(chars[i]==chars[i+1]){
                return false;
            }
            i++;
        }
        return true;
    }

上面潜在问题与风险:

字符编码问题:此方法假设所有字符都可以使用char类型处理,这对于大多数ASCII和Unicode字符是有效的。但是,如果处理包含如中文、希伯来文等复杂脚本的字符串时,单个字符可能需要多个char来表示(Java中的String和char基于UTF-16编码,对于代理对这种情况需要特殊处理)。这可能不是您想要的行为,尤其是在处理全球化的应用程序时。
性能效率问题:该方法对字符串进行排序,这在字符串非常长时可能非常耗时。对于判断字符串是否唯一的目的,排序并不是最高效的方法,因为它的时间复杂度是O(nlogn)。
空间复杂度问题:转换字符串为字符数组并进行排序将需要额外的O(n)空间复杂度,这在某些内存受限的场景下可能不是最佳选择。
异常处理:方法中没有对输入参数astr进行空值检查。虽然Java中对空字符串进行排序不会抛出异常,但如果业务逻辑不允许空字符串的存在,应当显式检查。
优化方向
使用HashSet:一个更高效的方法是使用HashSet。HashSet是一个无序、不重复元素的集合,它的添加操作的时间复杂度接近O(1)。可以通过遍历字符串的每个字符,尝试将它们添加到HashSet中来判断字符是否重复。如果字符重复,HashSet会拒绝添加,并立即返回false。这种方法的时间复杂度接近O(n),且不需要额外排序,更高效。
检查字符串长度:可以通过直接检查字符串的长度和字符集的大小来快速判断字符串是否包含重复字符。例如,如果字符串长度大于字符集的大小(考虑Unicode,这个字符集大小是固定的,即Character.MAX_VALUE),则一定存在重复字符,可以直接返回false。这种方法可以提前终止一些不必要的检查,尤其是在字符串很长时。
不使用额外空间:如果空间复杂度是一个重要考虑因素,可以通过遍历字符串,使用一个长度为Character.MAX_VALUE的boolean数组来标记字符是否出现过。这样可以将空间复杂度降低到O(1),但会稍微牺牲一些时间复杂度,因为需要额外的逻辑来处理Unicode代理对。
代码可读性:当前方法的实现逻辑较为间接(通过排序来寻找重复),对于未深入了解的读者可能不够直观。使用HashSet或其他直接算法可以提高代码的可读性和可维护性。
安全性和边界条件
安全性:此方法不涉及网络、文件访问或其他外部资源,因此从传统意义上讲是安全的。但是,它依赖于Java String和字符数组的实现,应确保使用的Java环境没有相关安全漏洞。
边界条件:应当检查输入参数是否为null,避免潜在的NullPointerException。同时,空字符串("")应当被认为是不包含重复字符的,这一点当前实现处理得当。
以下是相应的代码优化。请注意,由于涉及的修改较为复杂,一些细节可能需要进一步调整。

根据上述建议,我们可以使用HashSet来优化原代码,不仅提高性能,同时增强代码的可读性和可维护性。以下是使用HashSet重构后的代码:

 1 public class StringUniqueChecker {
 2     /**
 3      * 用于判断一个字符串的字符是否都是唯一的,即没有重复的字符。
 4      * 使用HashSet来检查字符是否重复,HashSet的add方法会自动拒绝重复的元素。
 5      * @param astr 输入的字符串
 6      * @return 如果字符串中的字符都是唯一的,则返回true;否则,返回false。
 7      */
 8     public boolean isUnique(String astr) {
 9         // 检查输入是否为null或空字符串
10         if (astr == null || astr.isEmpty()) {
11             return true;
12         }
13 
14         HashSet<Character> set = new HashSet<>();
15         for (int i = 0; i < astr.length(); i++) {
16             char c = astr.charAt(i);
17             // 如果set中已经包含了当前字符,则说明有重复字符
18             if (set.contains(c)) {
19                 return false;
20             }
21             set.add(c);
22         }
23         return true;
24     }
25 }

 

      

标签:字符,判断,HashSet,重复,复杂度,唯一,字符串,astr
From: https://www.cnblogs.com/bwcx1375/p/18110843

相关文章

  • 小美的字符串匹配度(美团2024届秋招笔试第一场编程真题)
    题面核心思想对于本来就匹配的肯定不能动用HashMap<Character,List>mp=newHashMap<>()存放当s[i]!=t[i]时字符t[i]的下标i,表示t[i]的这个字符出现在t的位置通过list去遍历s[i]在t中的位置,交换后对结果的贡献+1或+2代码importjava.util.*;publicclassMai......
  • Python从0到100(九):Python字符串介绍及使用
    一、字符串的定义1.什么是字符串字符串是一种表示文本数据的类型。所谓字符串,就是由零个或多个字符组成的有限序列,一般记为:s=a......
  • 判断ip地址是否合法(美团2024届秋招笔试第三场编程真题)
    核心思想大模拟-。-,还是不够细心,面向样例编程,一路错过去的。写得太丑了凑合看吧。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scannerscanner=newScanner(Syste......
  • 每日一题 --- 找出字符串中第一个匹配项的下标[力扣][Go]
    找出字符串中第一个匹配项的下标题目:28.找出字符串中第一个匹配项的下标给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sa......
  • 每日一题 --- 右旋字符串[卡码][Go]
    右旋字符串题目:55.右旋字符串(第八期模拟笔试)(kamacoder.com)题目描述字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串s和一个正整数k,请编写一个函数,将字符串中的后面k个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于......
  • c语言字符串逆序-基础知识
    c语言字符串逆序(1)错误输出(2)正确输出:方法1(3)正确输出:方法2......
  • 实现两个字符串相乘
    ‘’’有两个字符串,str1,str2,内容为数值,数值均大于0请编写算法计算两个字符串相乘的结果,不可以使用大数据类型,不可以把字符串直接转成整数来处理。题目要求的很明确,不可以直接把字符串转成整数然后相乘,所以int(str1)*int(str2)是不被允许的。不止如此,第三个示例里,数值已经......
  • 【学习笔记】字符串基础:后缀数组
    后置数组好难啊好难啊好难啊好难啊好难啊好难啊最后还是听了不知道从ftp里搞出来的yspm讲课视频才听懂的,但是yspm用的屏幕绘画是看不见的比较尊贵,然后开了画图本文约定字符串下标从\(1\)开始后缀数组后缀数组,即\(\text{SA(SuffixArray)}\),主要关系到两个数组:\(sa......
  • 【Python基础】判断语句
    文章目录@[toc]布尔类型示例比较运算符逻辑运算符and示例or示例not示例特殊情况下的逻辑运算符andorif判断语句格式示例else判断语句格式示例elif语句格式执行流程示例if嵌套格式示例个人主页:丷从心.系列专栏:Python基础学习指南:Python学习指南布尔......
  • 循环语句+数据类型的内置方法(数字,字符串)
    今日大纲while循环continuebreak要避免死循环,会造成CPU占用标志位:tag,类似于break的效果,但是多层while嵌套时,break只能退出本层循环,tag就可以定义到任意层。tag=Truewhiletag: if....: tag=Falsefor循环用来遍历可迭代类型(能索引取值的数据类型,只......