精华内容
下载资源
问答
  • 今天小编就为大家分享一篇java 判断字符串中是否有重复字符的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • PTA-浙大版《Python 程序设计》题目集-第3章-16 删除重复字符 (20分) 本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串...
  • js代码-给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
  • java 去掉重复字符 三个方法

    热门讨论 2013-03-24 15:44:39
    可以将字符串中的重复字符去除。程序设计精致,涉及到集合、集合foreach方法迭代、instanceof操作符的使用,适合Java初学者作为学习资料。
  • 重复字符的最长子串

    千次阅读 2020-06-16 22:29:02
    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无...

    image

    1.题目

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    

    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    

    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    2.我的题解

    2.1思路

    对于给定的字符串,定义一个指针i

    从0开始往右滑动

    判断第i个字符是否在i的左侧出现过

    如果没有出现过

    记录下此时0到i的值l

    如果发现有重复的字符m了

    先找到m这个字符在左侧出现的位置x

    然后删掉从0到x位置的左右字符,包括x

    对比l和(i-x)的大小,取较大者赋值给l

    直到i走到最右端

    l即为解

    时间复杂度为O(n)

    空间复杂度为O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。

    2.2图解

    image

    计算完第一个字符,目前无重复字符的最长子串是a,所以l=1

    image

    计算完第二个字符,目前无重复字符的最长子串是ab,所以l=2

    image

    计算完第三个字符,目前无重复字符的最长子串是abc,所以l=3

    image

    计算完第四个字符,删除a,以及a之前的字符,目前无重复字符的最长子串是bca,所以l=3

    image

    计算完第五个字符,删除b,以及b之前的字符,目前无重复字符的最长子串是cab,所以l=3

    image

    计算完第六个字符,删除c,以及c之前的字符,目前无重复字符的最长子串是abc,所以l=3

    image

    计算完第七个字符,删除b,以及b之前的字符,目前无重复字符的最长子串是cb,所以l=2

    image

    计算完第八个字符,删除b,以及b之前的字符,目前无重复字符的最长子串是b,所以l=1

    l取最大值,就是3

    2.3 代码1

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            StringBuilder stringBuilder = new StringBuilder();
            int l = 0;
            for (int i = 0; i < s.length(); i++) {
                String c = String.valueOf(s.charAt(i));
                if (stringBuilder.indexOf(c) >= 0) {
                    stringBuilder.delete(0, stringBuilder.indexOf(c) + 1);
                }
                stringBuilder.append(c);
                l = Math.max(stringBuilder.length(), l);
            }
            return l;
        }
    }
    

    image

    时间复杂度还算满意

    但是为什么内存消耗才击败了5%的用户?

    image

    不能忍

    我以为是循环里边有个字符串局部变量的定义和操作造成的

    于是尝试第二种方法

    将循环内的String变量定义给去掉了

    2.4 代码2

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            StringBuilder sb = new StringBuilder(s);
            int l = 0, i = 0;
            while (i < sb.length()) {
                int x = sb.indexOf(String.valueOf(sb.charAt(i)));
                if (0 <= x && x < i) {
                    sb.delete(0, x + 1);
                    i = i - x - 1;
                } else {
                    i++;
                }
                l = Math.max(l, i);
            }
            return l;
        }
    }
    

    image

    image

    没想到耗时上去了,内存消耗纹丝未动

    不能忍

    我又以为是新定义了一个Stringbuilder造成的

    于是将StringBuilder变量去掉了,值保留输入的String

    又测试了下边的这个代码3

    2.5 代码3

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int l = 0, i = 0;
            while (i < s.length()) {
                int x = s.indexOf(s.charAt(i));
                if (0 <= x && x < i) {
                    s = s.substring(x + 1);
                    i = i - x - 1;
                } else {
                    i++;
                }
                l = Math.max(l, i);
            }
            return l;
        }
    }
    

    image

    image

    结果内存消耗没有下来

    执行时间反而慢了好多倍

    虽然不能忍

    但是我也没其他想法了

    3. 他山之石可以攻玉

    自己没本事就多学习吧

    image

    3.1 最受欢迎的解法

    于是我找到了leetcode上最受欢迎的Java解法

    思路

    【滑动窗口】

    暴力解法时间复杂度较高,会达到 O(n^2),故而采取滑动窗口的方法降低时间复杂度

    定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值为字符位置 +1,加 1 表示从字符位置后一个才开始不重复

    我们定义不重复子串的开始位置为 start,结束位置为 end

    随着 end 不断遍历向后,会遇到与 [start, end] 区间内字符相同的情况,此时将字符作为 key 值,获取其 value 值,并更新 start,此时 [start, end] 区间内不存在重复字符

    无论是否更新 start,都会更新其 map 数据结构和结果 ans。

    时间复杂度:O(n)

    具体代码实现如代码4

    代码4

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
            Map<Character, Integer> map = new HashMap<>();
            for (int end = 0, start = 0; end < n; end++) {
                char alpha = s.charAt(end);
                if (map.containsKey(alpha)) {
                    start = Math.max(map.get(alpha), start);
                }
                ans = Math.max(ans, end - start + 1);
                map.put(s.charAt(end), end + 1);
            }
            return ans;
        }
    }
    

    image

    image

    虽然执行的耗时比我的方法快了一点点

    但是内存消耗还是这样,并没有得到提升

    3.2 官方解法

    image

    人在屋檐下,不得不低头

    学学人家官方的大佬吧

    思路

    使用「滑动窗口」来解决这个问题了:

    我们使用两个指针表示字符串中的某个子串(的左右边界)。其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的 r_krk;

    在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;

    在枚举结束后,我们找到的最长的子串的长度即为答案

    时间复杂度:O(N),其中 N 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。

    空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [0, 128)[0,128) 内的字符,即∣Σ∣=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有∣Σ∣ 个,因此空间复杂度为 O(∣Σ∣)

    代码5

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            // 哈希集合,记录每个字符是否出现过
            Set<Character> occ = new HashSet<Character>();
            int n = s.length();
            // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
            int rk = -1, ans = 0;
            for (int i = 0; i < n; ++i) {
                if (i != 0) {
                    // 左指针向右移动一格,移除一个字符
                    occ.remove(s.charAt(i - 1));
                }
                while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                    // 不断地移动右指针
                    occ.add(s.charAt(rk + 1));
                    ++rk;
                }
                // 第 i 到 rk 个字符是一个极长的无重复字符子串
                ans = Math.max(ans, rk - i + 1);
            }
            return ans;
        }
    }
    

    image

    image

    你是官方啊

    就这点水平???

    4. 总结

    这道题虽然不难

    但是管中窥豹,发现需要注意的地方还是有很多的

    Java中String的操作相对StringBuilder()来说是非常耗时的

    查看Java源码可以看到

    你对String的每一次操作,都是new了一个String

    算法也许没有最优的

    要么时间换空间

    要么空间换时间

    优化都是在出现问题的时候要做的取舍操作

    最后,我还是想知道把我击败的95%的大佬是怎么干的

    image

    各位大佬谁能给我点提示?

    文/戴先生@2020年6月16日

    —end—

    题目和部分代码来源于:力扣(LeetCode)

    更多精彩推荐



    image

    展开全文
  • 求字符串中第一个出现的最长重复字符串。输入任意一个字符串,此程序可求得第一个出现的最长重复字符串。
  • 1. 题目描述 题目链接:最长不含重复字符的子字符串 2. 题目分析 我们可以看到,题目要求我们求在一个区间内不含有重复的字符串,这种区间,我们第一时间应该想到滑动窗口。 这个题目的巧妙在于:我们利用HashMap的...

    1. 题目描述

    题目链接:最长不含重复字符的子字符串
    在这里插入图片描述

    2. 题目分析

    1. 我们可以看到,题目要求我们求在一个区间内不含有重复的字符串,这种区间,我们第一时间应该想到滑动窗口。
    2. 这个题目的巧妙在于:我们利用HashMap的key存储字符,利用value存储当前的下标
    3. 当我们的key重复时,也就证明当前窗口中的字符串不是重复的,需要将左边界的窗口下标进行修改,直接让 左边界的下标 = value + 1 这样的话,避免了一些重复的操作,比如样例:poujhwwer
    4. 为什么要和原来的left比较呢? 因为我们记录的是重复的,如果像abba这样,就会发生错误。
    5. 每次进行操作都算一下滑动窗口中的大小,最后输出count。

    3. 题目代码

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int left = 0;
    		int count = 0;
    		HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    		for (int right = 0; right < s.length(); right++) {
    			if (map.containsKey(s.charAt(right))) {
    				left = Math.max(left, map.get(s.charAt(right)) + 1);
    			}
    			map.put(s.charAt(right), right);
    			count = Math.max(count,right-left + 1);
    		}
    		return count;
        }
    }
    

    在这里插入图片描述

    展开全文
  • 删除字符串中连续的重复字符Constraints: 限制条件: (length of string) < 10000 Example: 例: Sample Input 1: bbccbb Sample Output 1: After removing consecutive duplicates, the answer...

    删除字符串中连续的重复字符

    Constraints:

    限制条件:

        (length of string) < 10000
    
    

    Example:

    例:

        Sample Input 1:
        bbccbb
        
        Sample Output 1:
        After removing consecutive duplicates, the answer is :: bcb
    
        Sample Input 2:
        aabccbba
    
        Sample Output 2:
        After removing consecutive duplicates, the answer is :: abcba
    
    

    Explanation of the problem:

    问题说明:

    1. Find the length of the input string and create an empty string to the answer and add the first character of the input string to the answer string.

      找到输入字符串的长度,并为答案创建一个空字符串,然后将输入字符串的第一个字符添加到答案字符串。

    2. Store the 0th character of the string in one character variable (let's name it as first) to store the duplicate character that has already added to the answer string.

      将字符串的第0个字符存储在一个字符变量中(让我们以第一个命名),以存储已经添加到答案字符串中的重复字符。

    3. Start iterating from the first index to the end of the input string.

      从第一个索引开始迭代到输入字符串的末尾。

    4. If the current character is different from stored duplicate variable then add it to our answer string and make the current character as a duplicate character.

      如果当前字符与存储的重复变量不同,则将其添加到我们的答案字符串中,并使当前字符成为重复字符。

    5. After the whole string has been iterated, return the answer string.

      重复整个字符串后,返回答案字符串。

    The time complexity of the above code is O(length of string).

    上面代码的时间复杂度是O(字符串的长度)。

    C++ Implementation

    C ++实现

    #include <iostream>
    #include <string>
    using namespace std;
    
    string removeduplicates(string s){
    	int n = s.length();
    	string ans = "";
    	// Adding the first character to the ans
    	ans = ans + s[0];
    	// first is the character to keep the track of included character
    	char first = s[0];
    	for(int i = 1;i<n;i++){
    		// ch is the current character
    		char ch = s[i];
    		/* if already included character is different from our 
    		current character then add current character to the ans
    		and assign current character to included character */
    		if(ch != first){
    			ans = ans + s[i];
    			first = s[i];
    		}       
    	}
    	return ans;
    }
    
    // Driver programm to check the code
    int main() {
    	string s1 ;
    	cout<<"Enter string: ";
    	cin >>s1;
    	cout<<"Entered string is: "<<s1<<endl;	
    	cout<<"After removing consecutive duplicates, string: " << removeduplicates(s1) << endl;
    }
    
    

    Output

    输出量

    Enter string: bbccbb
    Entered string is: bbccbb
    After removing consecutive duplicates, string: bcb
    
    
    

    翻译自: https://www.includehelp.com/algorithms/removing-consecutive-duplicates-from-a-string.aspx

    删除字符串中连续的重复字符

    展开全文
  • Python删除重复字符

    千次阅读 2020-04-29 08:46:34
    本题目要求找出输入字符串中重复的字符,并输出去掉重复字符后的字符串以及重复的字符是哪些,重复了几次。 1.1 输入格式 输入一个字符串。 1.2 输出格式 输出去掉重复字符的字符串,每个重复的字符重复了几次。 ...


    1. 题目🔍

    本题目要求找出输入字符串中重复的字符,并输出去掉重复字符后的字符串以及重复的字符是哪些,重复了几次。

    1.1 输入格式

    输入一个字符串。

    1.2 输出格式

    输出去掉重复字符的字符串,每个重复的字符重复了几次。

    1.3 输入样例

    在这里给出一组输入。例如:

    ajlrihvnvgugnmkh

    1.4 输出样例

    在这里给出相应的输出。例如:

    ajlrihvngumk
    v 2
    g 2
    n 2
    h 2


    2. 题解✨

    2.1 思路

    关键 创建两个空字符串和一个空字典📔

    • 字符串1用来存储输入字符串中没有重复的字符
    • 字符串2用来存储剩下的字符(重复的字符)
    • 字符串2的字符当作key🔑、字符的重复次数当作value依次存入字典

    2.2 代码

    string = input()
    result_str = ''
    redundant_str = ''
    dic = {}
    
    for i in string:
        if i not in result_str:
            result_str += i			# 将非重复的字符依次存入result_str
        else:
            redundant_str += i		# 将重复的字符依次存入redundant_str
    
    for i in redundant_str:			# 将redundant_str中的元素存入字典
        if i not in dic:
            dic[i] = 2				# 元素已经在result_str中存在,故redundant_str中出现的应该记为第二个
        else:
            dic[i] += 1				# 若元素已在dic中存在,键值 +1
    
    print(result_str)
    
    for k, v in dic.items():		# 遍历字典,输出键值对
        print('{} {}'.format(k, v))
    

    相关内容

    展开全文
  • Java 判断字符串有无重复字符

    千次阅读 2020-01-30 10:19:26
    问题描述:给定一个字符串,判断字符串有无重复字符,如果不使用额外的数据结构又应该如何处理(不使用辅助数组等)? 解一:如果字符串是ASCII码的字符串可以使用一个辅助数组进行统计,因为ASCII码只有128个字符,...
  • 面对一连串的字符,有时候我们想要删除重复字符,有时候又想删掉所有的字符只保留数字,肿么办捏? 别急,下面一一为您解答。
  • 【算法-Java实现】去除字符串中的重复字符

    千次阅读 多人点赞 2020-10-23 21:13:24
    【算法-Java】去除字符串中的重复字符 一.问题描述: 1.输入:输入一个String字符串str。 2.输出:去除这个字符串str的重复字符,按照字符出现的顺序输出这个无重复的字符串result。 比如: 输入:“hkdhkdhkd" 输出...
  • 在字符串中找出重复字符

    千次阅读 2020-08-25 23:29:15
    一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串。 给定任意字符串,请帮小强找出其中的最长重复子串。 例子01010101 输出4 #include <...
  • 给定一个字符串,找出不含有重复字符的最长子串的长度。 示例: 给定"abcabcbb",没有重复字符的最长子串是"abc",那么长度就是3。 给定"bbbbb",最长的子串就是"b",长度是1。 给定"pwwkew",最长子串是"...
  • 实现查找字符串中的重复字符和删除重复字符java学习记录** String str=&amp;amp;quot;&amp;amp;quot;; System.out.println(str); String str1=&amp;amp;quot;&amp;amp;quot;; //目的字符串 for...
  • 从键盘接收一个字符串。然后按照字符串顺序从小到大进行排序,并删除重复字符
  • **给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 如:输入abcabcbb 输出3 因为无重复最长字符串是“abc” 第一次看见这个问题时网上查找发现没有竟然没有C语言实现的代码 于是自己写了代码以及思路...
  • 删除重复字符(Python)

    千次阅读 2020-10-25 13:54:47
    删除重复字符 本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式: 输出去重排序后的结果字符串...
  • C语言----无重复字符的最长子串

    千次阅读 2021-01-16 15:56:39
    给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 示例1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s = "bbbbb" 输出: 1 解释: ...
  • 删除重复字符

    千次阅读 2019-01-09 22:59:44
    牛牛有一个由小写字母组成的字符串s,在s中可能有一些字母重复出现。比如在"banana"中,字母'a'和字母'n'分别出现了三次和两次。 但是牛牛不喜欢重复。对于同一个字母,他只想保留第一次出现并删除掉后面出现...
  • 重复字符的最长子串Java版(力扣)

    千次阅读 多人点赞 2021-03-16 14:04:05
    重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s = ...
  • 题目:最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串中"arabcacfr",最长非重复子字符串为...
  • c语言 删除重复字符

    千次阅读 2020-03-28 22:37:50
    本题要求编写程序,将给定字符串去掉重复字符后,按照字符ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串(少于80个字符)。 输出格式: 输出去重排序后的结果字符串。 我的答案:...
  • 如何判断字符串是否包含重复字符 一种以时间换空间的方法 """ 判断一个字符串是否重复字符 例如:good就包含重复字符 而abc就不包含重复字符串 """ def isDup(strs): lens = len(strs) i = 0 while i < lens: ...
  • 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例2: 输入: “bbbbb” 输出: 1 解释: ...
  • 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1...
  • 删除重复字符 (20分)

    千次阅读 2020-07-16 19:22:36
    //记录不重复字符的个数 } } for(i=0;i;i++)//冒泡排序 { for(j=0;j;j++) { if(strConserve[j]>strConserve[j+1]) { t=strConserve[j]; strConserve[j]=strConserve[j+1]; strConserve[j+1]=t; } } } for (i = 0;i; ...
  • java删除重复字符

    千次阅读 2019-05-14 00:52:27
    1. 删除重复字符串,只包含'a-z' method 1 import java.util.*; import java.io.*; public class Text{ public static void main(String[] args)throws IOException { InputStreamReader input = new I...
  • JS字符串剔除重复字符

    千次阅读 2018-08-15 23:11:15
    JS字符串剔除重复字符,JS字符串剔除重复字符的注意事项有哪些,下面就是实战案例,一起来看一下。 ()和\number 配合使用表示重复正则第number个括号内匹配到的内容, 如:(\d)\1表示重复第一个匹配块(\d)即等价于...
  • 13.找到字符串的最长无重复字符串字串 题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。 输入 [2,3,4,5] 返回值 4 输入 [2,2,3,4,3] 返回值 3 分析 1.本来我是想...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,087,820
精华内容 435,128
关键字:

重复字符