c语言字典序最小起始位置最大子字符串,删除多余的字符得到字典序最小的字符串...

import java.util.Scanner;

public class Main{

public static void main(String[] args){

Scanner scanner = new Scanner(System.in);

while(scanner.hasNext()){

String input = scanner.next();

System.out.println(del(input));

}

}

public static String del(String input){

char[] str  = input.toCharArray();

int[] map = new int[26];

for(int i=0;i

// 字母出现次数统计,记得要减去'a'

map[str[i] - 'a']++;

}

// 结果

char[] res = new char[26];

// res的目前最后一位

int index = 0;

int l = 0;

int r = 0;

while(r != str.length){

// 若此字符已挑选过,或是后面还会出现,则跳过

if(map[str[r] - 'a'] == -1 || --map[str[r] - 'a']>0){

r++;

}else{

// 挑选出字典序最小的字符,遍历一遍从左到右依次比较即可

int pick = -1;

for(int i=l;i<=r;i++){

if(map[str[i] - 'a'] != -1 && (pick == -1 || str[i]

pick = i;

}

}

// 把挑选结果放入结果

res[index++] = str[pick];

// 把后面的还要考虑的字符数加回来

for(int i=pick+1;i<=r;i++){

if(map[str[i] - 'a'] != -1){

map[str[i] - 'a']++;

}

}

// 标记为已挑选过的字符

map[str[pick] - 'a'] = -1;

l = pick+1;

r = pick+1;

}

}

return String.valueOf(res);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值