首页 > 试题广场 >

字符集合

[编程题]字符集合
  • 热度指数:76011 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个字符串,求出该字符串包含的字符集合,按照字母输入的顺序输出。

数据范围:输入的字符串长度满足  ,且只包含大小写字母,区分大小写。

本题有多组输入

输入描述:
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。


输出描述:
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
示例1

输入

abcqweracb

输出

abcqwer
示例2

输入

aaa

输出

a
1. C++ 里的 哈希表头文件原来叫  <unordered_map>

#include <iostream>
#include <string>
#include <map>
#include <unordered_map>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::unordered_map;


int main() {
    
    string inputStr;
    string outputStr;
    
    while (cin >> inputStr) {
        
        // 清空输出结果的字符串,不然二次输入会重复
        outputStr.clear();
        
        // 哈希表,记录是否已经重复
        // 由于比较短,哈希的映射为 O(1)
        unordered_map<char, bool> isStore;
        for (char i = 'a'; i <= 'z'; i++) {
            isStore.insert(std::pair<char, bool>(i, false));
        }
        for (char i = 'A'; i <= 'Z'; i++) {
            isStore.insert(std::pair<char, bool>(i, false));
        }
        
        for (unsigned long i = 0; i < inputStr.size(); i++){
            if (isStore[inputStr[i]]) {
                continue;
            }
            else {
                outputStr = outputStr + inputStr[i];
                isStore[inputStr[i]] = true;
            }
        }
        cout << outputStr << endl;
    }
    
    return 0;
}




发表于 2021-03-30 20:54:39 回复(0)
构建一个字典,key为字符,value为其在字符串中第一次出现的位置。然后对字典按value排序,将键连接成字符串即为所求。
while True:
    try:
        s = input()
        d = dict()
        for i in range(len(s)):
            if s[i] in d:
                continue
            else:
                d[s[i]] = i
        new_tuple = sorted(d.items(), key=lambda x: x[1])
        print(''.join([pair[0] for pair in new_tuple]))
    except:
        break


发表于 2020-11-11 15:45:17 回复(0)

直接用set或者unordered_set去重,根据set的size作为是否重复的判断依据,然后将不重复的字符加入输出字串

#include
#include
#include

using namespace std;

int main() {
    string tmpstr;
    while(cin >> tmpstr) {
        string outstr;
        unordered_set uset;
        int size = 0;
        for(auto s : tmpstr) {
            uset.insert(s);
            if(uset.size() > size) {
                outstr.push_back(s);
                size++;
            }
        }
        cout << outstr << endl;
    }

    return 0;
}
发表于 2020-02-20 17:32:29 回复(1)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String s=sc.nextLine();
            String n="";
            for(int i=0;i<s.length();i++){//遍历字符串s的每个字符
                //String.valueOf(s.charAt(i)是把那个字符转换为字符串
                if(!n.contains(String.valueOf(s.charAt(i)))){
                    n+=String.valueOf(s.charAt(i));
                }
            }
            System.out.println(n);
        }
    }
}

发表于 2019-12-01 09:46:17 回复(0)
✭头像
#include<iostream>
#include<string>
usingnamespacestd;
intmain(){
    string s;
    while(cin>>s){
        intN[1000]={0};
        for(inti=0;i<s.length();i++){
            if(N[s[i]-'0']==0){
                cout<<s[i];
                N[s[i]-'0']++;
            }
        }
        cout<<endl;
    }
    return0;
}

发表于 2019-06-10 17:47:15 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str;
    while(cin>>str)
    {
        int l=str.length();
        string str1={};
        for(int i=0;i<l;i++)
        {
            if(str1.find(str[i])==-1)
            {
                str1+=str[i];
            }
        }
        cout<<str1<<endl;
    }
    return 0;
}


发表于 2019-03-27 17:16:41 回复(1)
Y_P头像 Y_P
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    while(cin >> s)
    {
        string t = "";
        for(int i = 0; i < s.length(); i++)
        {
            if(t.find(s[i]) == -1)
            {
                t = t + s[i];
            }
        }
        cout << t << endl;
    }
}

发表于 2019-03-01 15:03:18 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String str=sc.next();
            int[] count=new int[266];
            for(int i=0;i<str.length();i++){
                count[str.charAt(i)]++;
                if(count[str.charAt(i)]==1)
                    System.out.print(str.charAt(i)+"");
            }
            System.out.println();
        }
    }
} 

发表于 2018-10-10 19:26:15 回复(2)
用HashSet记录字符是否已经出现过。
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()) {
            HashSet<Character> set = new HashSet<Character>();
            String str = scan.next();
            StringBuilder res = new StringBuilder();
            for(inti = 0; i < str.length(); i++) {
                if(!set.contains(str.charAt(i))){
                    set.add(str.charAt(i));
                    res.append(str.charAt(i));
                }
            }
            System.out.println(res.toString());
        }
    }
}

发表于 2018-08-28 14:43:24 回复(0)
#include <iostream>
#include <string>
#include <memory.h>
using namespace std;

int main()
{
    string s;
    while (cin >> s)
    {
        string res;
        bool visit[256];
        memset(visit, true, sizeof(visit));
        for (int i = 0; i < s.length(); i++)
        {
            if (visit[s[i]])
            {
                res.push_back(s[i]);
                visit[s[i]] = false;
            }
        }
        cout << res << endl;
    }
    return 0;
}
发表于 2018-08-21 16:32:45 回复(0)
为什么我的输出比原字符串还长,后面是一些没出现过的字符,readLine()得到的没错  遍历输出就有错
发表于 2018-07-26 09:32:32 回复(1)
#include <bits/stdc++.h>

using namespace std;

int main()
{     string s;     while(cin>>s)     {         int l = s.length();         int a[150];         memset(a,0,sizeof(a));         for(int i=0;i<l;i++)             a[s[i]]++;                  for(int i=0;i<l;i++)             if(a[s[i]]>=1)             {                 cout<<s[i];                 a[s[i]] = 0;             }         cout<<endl;     }     return 0;
}

发表于 2017-11-12 01:30:37 回复(0)
判断是否是第一次出现,复杂度为O(n^2).(也可以利用桶排序,复杂度为O(n))
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    string a;
    while(cin >> a){
    string res = "";
    for(int i = 0; i < a.length(); i++){
        if(a.find(a[i]) == i) res = res + a[i];
    }
    cout << res << endl;
    }
    return 0;
}

发表于 2017-11-06 16:59:21 回复(0)
#include <iostream>
#include <string>
#include <string.h>
using namespace std;

int main(){
    string str;
    while(cin>>str){
        bzero(hash,sizeof(hash));
        for(string::size_type idx=0;idx<str.size();++idx){
            if(str[idx]<='z'&&str[idx]>='a'){
                if(!hash[str[idx]-'a']){
                    cout<<str[idx];
                	hash[str[idx]-'a']=1;
                }
            }else{
                if(!hash[str[idx]-'A'+26]){
                    cout<<str[idx];
                	hash[str[idx]-'A'+26]=1;
                }
            }
        }
        cout<<endl;
    }
    return 0;
}

编辑于 2017-09-04 13:13:14 回复(0)
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
char[] array = str.toCharArray();
String str0 = ""+array[0];
for (int i = 1; i < str.length(); i++) {
boolean flag=false;
for (int j = 0; j < i; j++) {
if (array[i] == array[j]) {
flag=true;
break;
}
}
if(flag==false){
str0=str0+array[i];
}
}
System.out.println(str0);
}
}
}

发表于 2017-08-05 17:33:05 回复(0)
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
    char str[100];
    while(gets(str)){
        int n=strlen(str);
        int flag =0;
        cout<<str[0];
        for(int i=1;i<n;i++){
            flag =1;
            for(int j=0;j<i;j++){
            if(str[i]==str[j]){
                flag = 0;
                break;
            }
            }
            if (flag) {
                cout<<str[i];
            }
        }
        cout<<endl;
    }
    return 0;
}
发表于 2017-07-06 19:39:57 回复(0)
#include <iostream>
#include <vector>
using namespace std;
int main(){
    string a;
    while(cin >> a){
        vector<char> result;
        int hash [128] = {0};
        for(int i = 0; i < a.size(); i++){//不相同元素才push到vector中
            int asc = a[i];
            if(!hash[asc]){
                hash[asc] = 1;
                result.push_back(a[i]);
            }               
        }
        for(int j = 0; j < result.size(); j++)
            cout<<result[j];
        cout<<endl;
    }
}

发表于 2017-06-06 21:09:56 回复(0)
// LinkedHashSet 顺序 + 去重
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			char[] chars = sc.next().toCharArray()
			// 有序集合
			LinkedHashSet<Character> charSet = new LinkedHashSet<Character>();
			for (int i = 0; i < chars.length; i++) {
				charSet.add(chars[i]);
			}
			for (char c : charSet) {
				System.out.print(c);
			}
			System.out.println();
		}
		sc.close();
	}

编辑于 2017-03-31 00:12:16 回复(0)
#include <string>
#include <vector>
#include <iostream>
using namespace std;

// 很简洁
int main()
{
	string input;
	while (cin >> input)
	{
		string output;
		vector<bool> map(256, false);
		for (int i = 0; i < input.size(); i++)
		{
			if (!map[input[i]])
			{
				output += input[i];
				map[input[i]] = true;
			}
		}
		cout << output << endl;
	}

	return 0;
}

发表于 2017-03-14 17:03:26 回复(1)
//Set可以保证不重复,但不能保证顺序.我们可以利用set add是否成功来判断是否重复
//积累:char转String不能toString(),因为char是基本类型不能用方法 s.charAt(i)+""
import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String s=sc.nextLine();
            StringBuilder sb=new StringBuilder();//结果字符串
            Set<String> set = new HashSet<String>();
            for(int i=0;i<s.length();i++){
                if(set.add(s.charAt(i)+"")){//如set添加成功说明不重复
                    sb.append(s.charAt(i)+"");
                }
            }
            System.out.println(sb.toString());
        }
    }       
}


发表于 2017-03-06 11:55:38 回复(0)