首页 > 试题广场 >

字符串筛选

[编程题]字符串筛选
  • 热度指数:1781 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为字符串, 需要去除所有之前曾经出现过的字符,只保留第一次出现的字符
示例1

输入

"aab"

输出

"ab"

说明

删除了第二个a  
示例2

输入

"hellowelcometoxiaomi"

输出

"helowcmtxia"

说明

只保留了第一次出现的字符  

备注:
字符串只包含大小写字母
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String unique_string (String s) {
        HashSet<Character> set = new HashSet<>();
        char[] ch = s.toCharArray();
        StringBuilder sb = new StringBuilder();

        for (char c : ch) {
            if (!set.contains(c)) {
                set.add(c);
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

发表于 2021-06-22 14:56:34 回复(2)
核心代码: 
if (s.indexOf(s.charAt(i)) == i)
如果s的i位字符x不重复,s.indexOf(x)的索引值一定等于i
但是s的i位字符x重复,s.indexOf(x)的索引值只会返回第一次出现x时的索引
 public String unique_string (String s) {
        // write code here
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            if (s.indexOf(s.charAt(i)) == i) {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
时间复杂度o(n) 空间复杂度o(H) h为去重后字符串长度
发表于 2021-06-20 10:05:40 回复(1)
class Solution {
public:
    string unique_string(string s) {
        string res;
        unordered_set<char>se;
        for(int i=0;i<s.size();i++){
            if(!se.count(s[i])){
            res+=s[i];
                se.insert(s[i]);
            }
        }
        return res;
    }
};
思路是用set来去重
发表于 2021-06-22 22:22:07 回复(0)
位运算判重,字符串只包含大小写字母(52种),用一个long存储出现过的字母
public static String unique_string (String s) {
        long dic = 0;
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < s.length(); ++i) {
            long c = 1L << s.charAt(i) - 'a';
            if((dic & c) == 0){
                sb.append(s.charAt(i));
                dic |= c;
            }
        }
        return sb.toString();
    }


发表于 2022-04-28 23:34:31 回复(0)
class Solution:
    def unique_string(self , s ):
        ans=""
        while(s!=""):
            ans+=s[0]
            s=s.replace(s[0],"")
        return ans
        # write code here
用python的话貌似比较简单。。。
编辑于 2023-09-22 00:19:29 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String unique_string (String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        int length = s.length();
        String res = "";
        for (int i = 0; i < length; i++) {
            if (map.getOrDefault(s.charAt(i), 0) == 0) {
                map.put(s.charAt(i),map.getOrDefault(s.charAt(i), 0) + 1);
                res = res + s.charAt(i);
            }
        }
        return res;
    }
}
发表于 2022-09-12 10:30:48 回复(0)
class Solution {
public:
    string unique_string(string s) {
        // write code here
        vector<char>  tmp;
        unordered_map<char,int> mp;
        for(int i = 0;i < s.length();i++){
            if(!mp[s[i]]){
                tmp.push_back(s[i]);
                mp[s[i]]++;
            }
        }
        string result(tmp.begin(),tmp.end());
        return result;
    }
};
发表于 2022-08-16 00:52:59 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string unique_string(string s) {
        // write code here
        string ans = "";
        unordered_set<char> st;
        for (auto& c: s) {
            if (st.find(c) != st.end()) continue;
            st.insert(c);
            ans.push_back(c);
        }
        return ans;
    }
};

发表于 2022-04-12 09:12:13 回复(0)
//用一个Hashmap,设置一个空的字符串,遍历s,如果Hashmap中没有关键字,
//就加入到map中,并且把元素添加到str里,最后返回str。
import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String unique_string (String s) {
         HashMap< Character,Character> map=new HashMap();
         String str="";
            for(int i=0;i<s.length();i++)
          {
             char c=s.charAt(i);
             if(!map.containsKey(c)) {
                 map.put(c, c);
                 str=str+c;
             }
            }
   
     return str;
    }
}
发表于 2021-09-11 12:02:06 回复(0)
public String unique_string (String s) {
        // write code here
        int[]arr=new int[26];
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < s.length(); i++) {
            if (arr[s.charAt(i)-'a']==0) {
                sb.append(s.charAt(i));
                arr[s.charAt(i)-'a']++;
            }
        }
        return sb.toString();
    }


发表于 2021-08-23 09:26:41 回复(0)
set
public String unique_string (String s) {
    Set<Character> set = new HashSet<>();
    StringBuilder sb = new StringBuilder();
    for (char c : s.toCharArray()) {
        if (!set.contains(c)){
            set.add(c);
            sb.append(c);
        }
    }
    return sb.toString();
}
用数组表示,一个测试用例都过不去,但是在自己的IDE上可以过
public String unique_string (String s) {
    int[] cnt = new int[128];
    StringBuilder sb = new StringBuilder();
    for (char c : s.toCharArray()) {
        cnt[c]++;
        if (cnt[c] > 1 || c < 97) {
            continue;
        }
        sb.append(c);
    }
    return sb.toString();
}



发表于 2021-08-17 16:09:39 回复(0)
class Solution {
public:
    string unique_string(string s) {
        int a[200];
        string ss;
        memset(a,0,sizeof(a));
        for(int i=0;i<s.length();i++){
            int p=s[i]-'\0';
            if(a[p]==0){
                a[p]=1;
                ss+=s[i];
            }
        }
        return ss;
    }
};

发表于 2021-07-02 10:13:35 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String unique_string (String s) {
        // write code here
         HashMap hashMap = new HashMap();
        String news = new String();
        for(int i=0;i<s.length();i++){
            if(!hashMap.containsKey(s.substring(i,i+1))){
                hashMap.put(s.substring(i,i+1),true);
                news += s.substring(i,i+1);
            }
        }
        return news;
    }
}

发表于 2021-07-01 23:08:48 回复(0)
Hop头像 Hop
set集合去重如果有重复的元素add会返回false
public String unique_string (String s) {
        // write code here
        HashSet<Character> charList = new HashSet<>();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if(charList.add(s.charAt(i))){
                stringBuilder.append(s.charAt(i));
            }
        }
        return stringBuilder.toString();
    }


编辑于 2021-06-28 14:39:17 回复(0)
使用LinkedHashSet;记录元素的顺序,如果set中包含了这个元素,则不放置,继续下一个元素;最终的结果就是想要的结果


import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    public String unique_string (String s) {
        // write code here
        char[] ch = s.toCharArray();
        Set<Character> set = new LinkedHashSet<>();
        for (char c : ch){
            if (set.contains(c)){
                continue;
            }
            set.add(c);
        }
        char[] cc = new char[set.size()];
        Iterator<Character> iter = set.iterator();
        int i = 0;
         while (iter.hasNext()){
             char c = iter.next();
             cc[i++] = c;
         }
         String res = new String(cc);
         return res;
    }
}
发表于 2021-06-19 21:53:59 回复(0)
去重、用数组模拟哈希表去重
import java.util.*;
 
 
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    public String unique_string (String s) {
        // write code here
        if(s==null || s.length()<=1){
            return s;
        }
        int [] bucket =new int [128];
        char [] cs =s.toCharArray();
        int len =cs.length;
        StringBuilder sb =new StringBuilder();
        for(int i =0;i<len;i++){
            if(bucket[cs[i]]!=0){
                continue;
            }
            sb.append(cs[i]);
            bucket[cs[i]]++;
        }
        return sb.toString();
    }
}

发表于 2021-06-18 21:02:56 回复(3)