首页 > 试题广场 > 删除字符串中出现次数最少的字符
[编程题]删除字符串中出现次数最少的字符
  • 热度指数:195795 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
注意每个输入文件有多组输入,即多个字符串用回车隔开

输入描述:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。



输出描述:

删除字符串中出现次数最少的字符后的字符串。

示例1

输入

abcdd
aabcddd

输出

dd
aaddd
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int i, m,min;
	int a[26];
	string str,temp;
	while (cin >> str)
	{
		for (int i = 0; i < 26; i++)
			a[i] = 0;

		m = str.size();
		for (i = 0; i<m; i++)
			a[str[i]-'a']++;
		min = a[str[0]-'a'];
		for (i = 0; i<m; i++)
		if (a[str[i] - 'a'] <= min)
			min = a[str[i]-'a'];
		for (i = 0; i < m; i++)
		if (a[str[i] - 'a'] > min)
			cout << str[i];

		cout << endl;
	}	
	return 0;
}


发表于 2016-04-10 14:26:42 回复(38)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            
        String string=sc.nextLine();
        char[] A=string.toCharArray();
        Map<Character,Integer> m=new LinkedHashMap<Character,Integer>();
      
        
        for(char c:A){
            if(!m.containsKey(c)){
                 m.put(c,1);
                
            }else{
                m.put(c,m.get(c)+1);
               
            }     
        }
        Collection<Integer> al=m.values();
        int index=Collections.min(al);
      StringBuffer sb=new StringBuffer("");
        for(char c:A){
            if(m.get(c)!=index)
                sb.append(c);
        }
            
            System.out.println(sb.toString());
            
       }
       
    }
}

编辑于 2021-03-03 16:02:00 回复(21)
while True:
    try:
        a=input()
        b=[]
        c=''
        for i in range(len(a)):
            b.append(a.count(a[i]))
        for i in range(len(a)):
            if min(b)!=b[i]:
                c=c+a[i]
        print(c)      
    except:
        break
发表于 2018-08-04 23:21:06 回复(4)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String s = in.nextLine();
            int[] a = new int[26];
            for(int i=0;i<s.length();i++){
                a[s.charAt(i)-97]++;
            }
            int min = 21;
            //找出出现最小的次数
            for(int i=0;i<26;i++){
                if(a[i]<min && a[i]>0){
                    min = a[i];
                }
            }
            StringBuilder toBeDeleted = new StringBuilder();
            for(int i=0;i<26;i++){
                if(a[i]==min){
                    char c = (char)('a'+i);
                    toBeDeleted.append(c);
                }
            }
            String str = toBeDeleted.toString();
            StringBuilder res = new StringBuilder();
            for(int i=0;i<s.length();i++){
                if(!str.contains(s.charAt(i)+"")){
                    res.append(s.charAt(i));
                }
            }
            System.out.println(res);
        }
    }
    
}

发表于 2016-04-03 19:15:18 回复(2)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
            int[] num = new int[26];
            String line = cin.nextLine();
            for(int i=0; i<line.length(); i++) {
                char c = line.charAt(i);
                int n = (int)(c - 'a');
                num[n] ++;
            }
            int min = Integer.MAX_VALUE;
            for(int i=0; i<26; i++) {
                if(num[i] != 0 && num[i] < min) {
                    min = num[i];
                }
            }
            for(int i=0; i<line.length(); i++) {
                char c = line.charAt(i);
                int n = (int)(c - 'a');
                if(num[n] != min) {
                    System.out.print(c);
                }
            } 
            System.out.println();
        }
    }
}

发表于 2016-03-29 11:01:32 回复(13)

python3的解法,
使用defaultdict来做的。

from collections import defaultdict
while True:
    try:
        a = input()
        dd = defaultdict(int)
        for i in a:
            dd[i] += 1
        for i in dd:
            if dd[i] == min(dd.values()):
                a = a.replace(i, "")
        print(a)
    except:
        break
发表于 2017-09-06 14:18:31 回复(5)

一种新的编程思想:
1、将26个字母转换成1-26个数字来存储,来比较;
2、数组新用法:用数组索引来代表具体的数字,用具体索引锁存的数字来代表出现的次数

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()) {
            String str = sc.nextLine();
            int[] num = new int[26];//将字符转换为数字,存放在数组中
            for(int i=0; i<str.length(); i++) {
                char ch = str.charAt(i);
                int n = (int)(ch - 'a');
                num[n] ++;
            }
            int min = Integer.MAX_VALUE;//当不知有多少重复次数时的固定操作
            for(int i=0; i<26; i++) {
                if(num[i] != 0 && num[i] < min) {
                    min = num[i];
                }
            }
            for(int i=0; i<str.length(); i++) {
                char ch = str.charAt(i);
                int n = (int)(ch - 'a');
                if(num[n] != min) {
                    System.out.print(ch);
                }
            }
            System.out.println();//平台本身问题,需要输出这一句
        }
    }
}

发表于 2018-08-07 12:06:52 回复(4)
#include<iostream>
#include<string>

using namespace std;

int main()
{
   string str;
   
    
    while(getline(cin,str))
        
    {   int a[26]={0};
        for(int i=0;i<str.length();i++)
        {
           a[str[i]-'a']++;               
        }
       int min=a[str[0]-'a'];
       for(int i=0;i<str.length();i++)
        {
           if(a[str[i]-'a']<=min)
               min=a[str[i]-'a'];
        }
        for(int i=0;i<str.length();i++)
        {
           if(a[str[i]-'a']>min)
               cout<<str[i];
        }
        cout<<endl;
    }
    
    return 0;
}

发表于 2016-07-14 22:53:51 回复(7)
初始化min=1,建一个map,存Character和Integer,然后循环遍历字符串,存到map里,如果已经存在那
value+1,比较value和min,更新min,循环结束后在遍历字符串,只要map.get(当前char)的值不等于
min,那么就输出,最后在加上一个System.out.println()就不会出先拿个iiiizzzz

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    /**
     * 题目描述实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。
     * 输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 
     * 输入描述:字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
     * 输出描述:删除字符串中出现次数最少的字符后的字符串。
     * 输入:abcdd
     * 输出:dd
     */
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String str=sc.nextLine();
            int min=1;
            Map<Character,Integer> map=new HashMap<Character,Integer>();
            for(int i=0;i<str.length();i++){
                char c=str.charAt(i);
                
                if(map.containsKey(c)){
                    map.put(c, map.get(c)+1);
                }else{
                    map.put(c,1);
                }
                if(map.get(c)<min){
                    min=map.get(c);
                }
            }
            
            for(int i=0;i<str.length();i++){
                char s=str.charAt(i);
                if(map.get(s)!=min){
                    System.out.print(s);
                }
            }
            System.out.println();
        }
        

    }

}

发表于 2018-07-12 14:44:57 回复(8)
纯 c
#include<stdio.h>
#include<string.h>
int main(){
    char a[20];
     while(scanf("%s",a)!=EOF)
    { 
        int b[26];
         for(int i=0;i<26;i++)
             b[i]=0;
         int min=0;
        for(int i=0;i<strlen(a);i++)
            b[a[i]-'a']++;
        min=b[a[0]-'a'];
        for(int i=0;i<strlen(a);i++)
        if((b[a[i]-'a'])<=min)min=b[a[i]-'a'];
        for(int i=0;i<strlen(a);i++)
        if((b[a[i]-'a'])>min) printf("%c",a[i]);
         memset( a, 0, sizeof(a) ); //clear a[20]
           printf("\n");//vs能运行,到这里就得加换行符
     }
        //system("pause");
        return 0;

    }
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    while(cin>>str)//不能用getline(cin,str)
    {
        int len=str.size();
        int arry[26]={0};
        int min=0;
        for(int i=0;i<len;++i)
        {
            ++arry[str[i]-'a'];
        }
        
        min=arry[str[0]-'a'];
          
        for(int i=0;i<len;++i)
        {
            if(arry[str[i]-'a']<=min)
               min=arry[str[i]-'a'];
        }
        
         for(int i=0;i<len;++i)
        {
            if(arry[str[i]-'a']>min)
              cout<<str[i];
        }
            cout<<endl;
    }
   return 0;
}


编辑于 2018-06-01 20:22:46 回复(1)
//先建表,再根据表判断哪些元素是要删除的。
//删除时,(2)方法能在O(n)时间O(1)空间内完成。
#include<iostream>
#include<string>

using namespace std;

int main() {
	string str;
	while (cin >> str) {
		int mp[26] = { 0 };
		for (int i = 0; i < str.size(); ++i)
			mp[str[i] - 'a']++;
		int min = 10000;
		for (int i = 0; i < 26; ++i) {
			if (mp[i] != 0 && mp[i] < min) min = mp[i];
		}
        //(1)当数据量很大时,这肯定耗时
		/*for (int i = 0; i < str.size(); ) {
			if (mp[str[i] - 'a'] == min)
				str.erase(i, 1);      
			else ++i;
		}
        cout << str << endl;*/
        //(2)前后交换
        int i = 0, j = 0;
        while(j < str.size()) {
            if(i >= j || mp[str[j] - 'a'] == min) j++;
			else if(mp[str[i] - 'a'] == min)
                swap(str[i++], str[j++]);  
            else ++i;
		}
		cout << str.substr(0,i) << endl;
	}
	return 0;
}

发表于 2017-06-14 21:53:33 回复(2)
解题思路:1.首先,统计出每个字符在字符串中出现的次数,存放在动态数组num 中
                  2.然后,寻找数组num中的最小值
                  3.最后,若num[i]==min,则字符串中的第i个字符跳过,其他字符输出
C++实现代码:
#include<iostream>
#include<string>
using namespace std;
int findmin(int *p,int n);
int main()
{
    string str;
    while(getline(cin,str))
    {
        int len=0,i,j;
        while(str[++len]);
        int *num=new int[len];
        for(i=0;i<len;i++)
        {
            num[i]=0;
            for(j=0;j<len;j++)
            {
                if((str[i]==str[j])&&(i!=j))
                   {
                       num[i]++;
                   }
            }
        }
        int min=findmin(num,len);
        for(i=0;i<len;i++)
        {
            if(num[i]==min)
            {
                continue;
            }
            cout<<str[i];
        }
        cout<<endl;
        delete []num;
    }
    return 0;
}
int findmin(int *p,int n)
{
    int min=p[0];
    for(int i=0;i<n;i++)
    {
        if(min>p[i])
        {
            min=p[i];
        }
    }
    return min;
}
发表于 2019-08-22 08:48:43 回复(1)
import sys
for s in sys.stdin:
    s=s.strip()
    count=s.count(s[0])
    res=''
    for i in s:
        count=s.count(i) if s.count(i)<count else count
    for i in range(len(s)):
        if s.count(s[i])>count:
            res+=s[i]
    print res


发表于 2018-09-14 16:17:26 回复(2)
这里我使用hashmap<char,int>记录每个字符出现的次数,然后通过iterator对集合进行遍历查找min相同的值的char,通过replace正则表达式将这些字符全部都替换成""字符串输出即可
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main{
	
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			String str = in.next();
			Map<Character,Integer> map = new HashMap<Character,Integer>();
			int min = 100000;
			for(int i=0; i<str.length(); i++){
				char c = str.charAt(i);
				if (map.containsKey(c)) {
					int val = map.get(c);
					map.put(c, val + 1);
					if (val < min)
						min = val;
					continue;
				}
				map.put(c, 0);
				min = 0;
			}
			Set<Character> set = map.keySet();
			Iterator<Character> it = set.iterator();
			while(it.hasNext()){
				char c = it.next();
				if(map.get(c) == min)
					str = str.replaceAll("["+c+"]*", "");
			}
			System.out.println(str);
		}
        in.close();
	}
}

发表于 2017-09-14 13:45:28 回复(3)
#include <iostream>
#include <string>
#include <unordered_map>
#include <math.h>
using namespace std;

int main(){
    string s;
    while(cin>>s) {
        //因为这里只有26个小写字母,用一个int[26]其实就足够了。。懒得改了
        unordered_map<char,int> freq;
        int smallest = 1;
        for(char c : s) {
            freq[c]++;
            smallest = min(smallest,freq[c]);
        }
        for(char c : s){
            if(freq[c]==smallest)
                continue;
            cout<<c;
        }
        cout<<endl;
    }
    return 0;
}

发表于 2017-08-02 17:16:02 回复(4)
该题的思路是:从题目要求来看,最基本的是要知道输入字符串中每个字符出现的次数,即<字符,出现的次数>,很显然这可以用Map来实现,根据求出现次数最少可以用根据value排序的TreeMap来实现,去除当中value等于最小值的字符,以下是代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.TreeMap;
/**
 * 
 * @author 云上奔跑
 * @date 2017年5月1日 下午12:24:13
 */
public class Main {
     public static void main(String[] args){
    	Scanner sc=new Scanner(System.in);
    	while (sc.hasNextLine()) {
			String str=sc.nextLine();
			//利用Map来处理
			Map<Character, Integer> treeMap=new TreeMap<Character, Integer>();
			for(int i=0;i<str.length();i++){
				if(treeMap.containsKey(str.charAt(i))){
					treeMap.put(str.charAt(i), treeMap.get(str.charAt(i))+1);
				}else {
					treeMap.put(str.charAt(i), 1);
				}
			}
			
			//因为要根据value来排序,所以转换成list,重写sort
			List<Entry<Character, Integer>> list=new ArrayList<Entry<Character, Integer>>(treeMap.entrySet());
			
			Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
                //升序
				@Override
				public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
					// TODO Auto-generated method stub
					return o1.getValue().compareTo(o2.getValue());
				}
			});
			int min=1;
			if(list!=null){
				//获取list第一个value值,即最小值
				min=list.get(0).getValue();
			}
			//去除出现次数最少的字符
			for (Entry<Character, Integer> entry : list) {
				if(entry.getValue()!=min){
					break;
				}else  {
					str=str.replace(entry.getKey().toString(), "");
				}
				
			}
			System.out.println(str);
		}
    	sc.close();
    }
}

发表于 2017-05-01 12:24:32 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()) {
            
        
        String target=sc.nextLine();
        String min=minString(target);
        char[] ch=target.toCharArray();
        String res="";
        for (int i = 0; i < ch.length; i++) {
            if (min.indexOf(ch[i])==-1) {
                res+=ch[i];
            }
        }
        System.out.println(res);
        }
    }
    public static String minString (String str) {
        char[] ch=str.toCharArray();
        int[] count=new int[26];
        for (int i = 0; i < ch.length; i++) {
                count[ch[i]-'a']+=1;
        }
        
        for (int i = 1; i < 13; i++) {
            char[] temp = new char[20];
            int k=0;
            int num=0;
            for (int j = 0; j < count.length; j++) {
                if (count[j]==i) {
                    num++;
                    
                    temp[k++]=(char) (j+'a');
                }
            }
            if (num>0) {
                return String.valueOf(temp);
            }
        }
        return null;
        
        
    }
}
首先想到的是 做一个count[26]的数组记录 个字母出现的次数,然后删除最小值所在字母,但是存在的问题是 最小值可能存在多个。
   为了解决可能存在多个的情况,可以从双层遍历数组,外层从1到26(事实上13就够了)为当前可能出现的最小值,内层为遍历数组。如果存在count[*]==i,则这个count[*]就是最小值,遍历完数组 统计最小值的个数num 并将该字符添加到字符串中,如果num>0跳出  返回。
   得到含最小出现次数的字符组成的字符串min,然后依次遍历原字符串字符 看是否包含在min中,在则删除
 写的比较繁琐

发表于 2018-03-06 14:15:19 回复(0)
map是真的好用
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
    string str;
    while(cin>>str){
        map<char,int> M;
        int min=999;
        for(char i='a';i<='z';i++){
            M[i]=0;
        }
        for(int i=0;i<str.size();i++){
            M[str[i]]++;
            if(M[str[i]]<min) min=M[str[i]];
        }
        for(int i=0;i<str.size();i++){
            if(M[str[i]]!=min) cout<<str[i]; 
        }
        cout<<endl;
    }
    return 0;
}

发表于 2018-02-22 11:41:29 回复(1)
package HUAWEI;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 删除字符串中出现次数最少的字符
 * @author Administrator
 *
 */
public class Demo23 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			String s = sc.next();
			convert(s);
		}

		sc.close();
	}
	public static void  convert(String s){
		String result = "";
		LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
		for(int i=0;i<s.length();i++){
			char temp = s.charAt(i);
			if(map.containsKey(temp)){
				int value = map.get(temp);
				value++;
				map.put(temp,value);
			}else{
				map.put(temp,1);
			}
		}
		int min = Collections.min(map.values());
		LinkedHashMap<Character,Integer> map_del = new LinkedHashMap<>();
		for(Map.Entry<Character,Integer> entry:map.entrySet()){
			if(entry.getValue()==min){
				map_del.put(entry.getKey(),entry.getValue());
			}
		}
		for(int i=0;i<s.length();i++){
			char temp = s.charAt(i);
			if(!map_del.containsKey(temp)){
				result = result + String.valueOf(temp);
			}
		}
		System.out.println(result);
	}
}


发表于 2016-11-12 20:39:23 回复(0)
import java.util.Scanner;

public class Main {
	
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {//注意while处理多个case
            String str = sc.nextLine();
            int[] biao = new int[26];
            int i = 0;
            for(i=0;i<str.length();++i){
                biao[str.charAt(i) - 97]++;
            }
            int min = 0;
            for(i=0;i<26;++i){
                if(biao[i]!=0){
                    min = biao[i];
                    break;
                }
            }
            for(i=0;i<26;++i){
                if(biao[i]!=0 && biao[i]<min)
                    min = biao[i];
            }
            StringBuilder sb = new StringBuilder(str);
            int j = 0;
            for(i=0; i<26; ++i){
                for(j = 0;j<str.length();++j){
                    if(biao[i] == min && str.charAt(j) == (char)(i+97)){
                        sb.delete(j, j+1);
                        str = sb.toString();
                    }
                }
            }
            System.out.println(sb.toString());
        }
    }
}


发表于 2016-09-23 14:09:19 回复(0)