如何判断字符串是否含有重复字符

判断字符串是否含有重复字符共有几种不同的方法

方法一:

思 路:

    String string = "helloworld"

    1.将字符串转换成字符数组, char[ ]arr = string.toCharArray( );

    2.从字符串第一个字符开始遍历,

    通过判断当前字符第一次出现的下标,是否等于最后一次出现的下标,来判断字符是否重复。

    利用String方法   indexOf( )和lastIndexOf( )

 

实现代码:

public class Test{
    public static void main(String[]args){
        /**
         * 判断字符串是否含有重复字符:
         *     1.首先将字符串转成字符数组
         *     2.利用 indexof 与 lastindexof 判断字符是否重复
         */
        String string = "helloworld";
        char[]arr = string.toCharArray();
        for(char ch:arr) {
            if (string.indexOf(ch) != string.lastIndexOf(ch)) {
                System.out.println("字符串含有重复字符");
                break;
            }
        }
    }
}

方法二:
  位运算:
      >>右移运算符,二进制位全部右移若干位  多余则舍弃右边位数
      <<左移运算符,二进制位全部左移若干位  不足则补0
      
      假设要判断的字符串全部由小写英文字母组成
      我们以二进制的第 i 位 1或0 表示,第 i 个字母 存在或不存在,1001 第0位和第3位为1,表示字符 a 和 d 存在
      
      用num表示字符串字符是否出现过的二进制位,num首先赋值为0,用ch表示字符串某个字符,
      若(num>>(ch-'a'))&1==1,则表示ch字符出现过,则break
      若ch没有出现过,num与1做与运算,并左移ch-'a'位,(num|1)<<ch-'a'
   
  实现代码:
  
package java_sort;
import java.util.*;
public class Main{
    public static void main(String[] args) {//用位运算判断 string字符串是否含有重复字符
        ArrayList<String> arr =new ArrayList<String>();
        arr.add("hello");
        arr.add("fczvagh");
        arr.add("fdfd");

        /**
         * 由于构成可行解的字符串仅包含小写字母,且无重复元素,
         * 我们可以用一个二进制数来表示该字符串的字符集合,
         * 二进制的第 ii 位为 11 表示字符集合中含有第 ii 个小写字母,
         * 为 00 表示字符集合中不含有第 ii 个小写字母。
         *
         */
        for(String str:arr){
            String string=str;
            int mask=0;
            for(int i=0;i<string.length();++i){
                int num = string.charAt(i)-'a';//获取当前字符的 对应的二进制数
                if(((mask>>num)&1)==1){    //mask整体右移num位数,如果为1,表示当前字符已经出现过
                    System.out.println(string+"有重复字符,为:"+string.charAt(i));
                    break;
                }else {
                    mask |= 1 << num;   //否则,将mask num位数上 变为1并左移num位;
                                        // 表示num二进制代表的字符,已存在
                }
            }
        }
    }
}
 

方法三:

  思路:

    我们创建一个大小为26的数组,arr[ ],存储每个字符对应出现次数。

    遍历字符串的每一个字符,用字符串的字符减去一个字符‘a’ ,得到字符在字母表中的排序大小

    arr[ 排序大小]++,最后遍历一遍数组arr,若存在arr[i]>2的情况,表示该字符出现过两次以上。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面试题,是纸上写的,发现了些错误,回来改进了下。写纸上和写计算机里并编译成功完全是两个效果。 开始没太多字符串操作,很繁琐、难点也多,后逐渐改进。 典型问题1: sizeof()局限于栈数组 char a[] = "asd213123123"; 形式,并且这种不能用'\0'判断是否结束(这种判断方式能很方便加在while条件中用于判断越界——b != '\0')。 如果是字符串常量: char *b = "dasadafasdf"; 这种情况,sizeof()就废掉了! 总之: 对号入座,前者sizeof、后者strlen~!不过sizeof(a)和strlen(b)还有另外一个区别,strlen不计算'\0',而sizeof要计算(前提是sizeof()不针对char指针) 典型问题2: 用什么来暂存并输出结果?还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i 对应的长度(counter[i])都有了。 这是针对不知道字符串大小并且不占用额外空间的做法,需要非常繁琐的操作,要加很多标记,越界判断也会有些麻烦(结合优势么,用字符串常量而不是栈空间中的字符数组,有'\0'——就好判断了!) (关于空间的占用,如果要用一个和字符串a一样长的数组counter来计录a中各起点对应与b最大重合子字符串,这个数组也要和a一样长,空间上也不合适,除非情形很特殊,a短b长,不然不如直接malloc()一个堆空间来储存当前最长“子字符串”,并实时更新) 先放一个改完编译测试成功的。 release1 //题目:要求比较A字符串(例如“abcdef"),B字符串(例如(bdcda)。找出重合度最大的子字符串,输出(根据OJ经验,输>出结果对即可) #include #include #include main(){ char *A = "abcderfghi"; char *B = "aderkkkkkabcd"; int i,j,c = 0,count = 0; unsigned int maxSeg = 0; int max = strlen(A) > strlen(B) ? strlen(A) : strlen(B); char* final = (char*)malloc(sizeof(char) * (max + 1)); final[max] = '\0'; for(i = 0;A[i] != '\0';i++){ for(j = 0;B[j] != '\0';j++){ while(A[i + c] == B[j] && A[i+c] != '\0' && B[j] != '\0'){ count++; c++; j++; }                         if(count > maxSeg){                                 strncpy(final,(A + i),count);                                 maxSeg = count;                         } count = 0; c = 0; } } printf("%s\n",final); free(final); } 这是能将就用的第一个版本~!关于结束符'\0'能否影响free()的使用,觉得是完全不用操心的,因为malloc的大小是系统来保存的,删除时候系统来接手就完了,而'\0'结束符只是针对一些常规字符串操作,比如printf()用%s控制输出时~! 新难点:找到的子字符串同时一样长怎么办?那我这只能叫做”第一个最长的重合字符串“用两块空间来存储?三
C语言判断字符串是否存在重复字符的函数,可以通过使用数组和循环来实现。下面给出一个示例的函数实现: ```c #include <stdio.h> #include <stdbool.h> bool hasDuplicateCharacters(const char* str) { // 用一个数组来统计字符出现的次数,ASCII字符共有256个 int freq[256] = { 0 }; // 遍历字符串中的每个字符 for (int i = 0; str[i] != '\0'; i++) { // 如果该字符出现过,则返回true if (freq[(int)str[i]] > 0) { return true; } // 更新字符的出现次数 freq[(int)str[i]]++; } // 如果所有字符都未重复出现,则返回false return false; } int main() { const char* str1 = "abcde"; const char* str2 = "hello"; if (hasDuplicateCharacters(str1)) { printf("%s 包含重复字符\n", str1); } else { printf("%s 不包含重复字符\n", str1); } if (hasDuplicateCharacters(str2)) { printf("%s 包含重复字符\n", str2); } else { printf("%s 不包含重复字符\n", str2); } return 0; } ``` 该函数中,我们使用了一个长度为256的整型数组freq来统计字符串中每个字符出现的次数。通过遍历字符串中的每个字符,将其对应的数组元素加1来记录出现次数。如果某个字符的出现次数大于1,则说明该字符重复出现,函数返回true;否则,所有字符都未重复出现,函数返回false。 在main函数中,我们调用了hasDuplicateCharacters函数来判断两个字符串str1和str2是否存在重复字符,并输出相应的结果。 需要注意的是,该函数中只能判断ASCII字符范围内的重复字符,如果处理的字符串包含非ASCII字符,可能会出现错误结果。如果需要支持更多字符集,可以使用更高级的算法或数据结构来处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值