蛇形字符串

输入一个字符串(不包含空格),请寻找输入中包含的所有蛇形字符串。

蛇形字符串定义:

1、蛇形字符串由连续的字符对组成,其特点如下:

      1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小),如Aa,Dd

      1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如AaBbCc

2、从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:

     2.1 每次寻找必须是最长的蛇形字符串

     2.2 使用过的字符不能重复使用

输入描述:

      一个字符串(不含空格,字符串长度<= 5000)

输出描述:

      1、所有包含的蛇形字符串,按照首字母升序排列(即A在Z前)

      2、同一个首字母的情况,按照蛇形字符串的长度降序输出

      3、如果没有找到输出Not Found

输入示例(自己随便测试的)

DAFHAGFAHFIUHRjkfhbdajfhkEHFUWEIHAJSDKHncnthasrkjhaejsavbdcnskdscnjkdfhgbvsdfdnfkhgj&*(&%^&*(bdvdhjBSDZVBDFBDVH
输出示例:

AaBb
AaBb
AaBb
Aa
DdEeFfGgHh
DdEeFf
Dd
Dd
Dd
Ff
Ff
Ff
Hh
Hh
Hh
Hh
Hh
Hh
JjKk
RrSs
Ss
Vv
Vv

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

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        Map<Character, Integer> mA = new HashMap<>(); // 存储大写字母
        Map<Character, Integer> ma = new HashMap<>(); // 存储小写字母

        for (char ss : s.toCharArray()) {
            if (ss >= 'A' && ss <= 'Z') {
                mA.put(ss, mA.getOrDefault(ss, 0) + 1);
            }
            if (ss >= 'a' && ss <= 'z') {
                ma.put(ss, ma.getOrDefault(ss, 0) + 1);
            }
        }

        for (Map.Entry<Character, Integer> entry : mA.entrySet()) {
            char key = entry.getKey();
            int value = entry.getValue();

            if (ma.containsKey((char) (key + 32))) {
                continue;
            } else {
                mA.remove(key);
            }
        }

        if (mA.isEmpty()) {
            System.out.println("Not Found");
            return;
        }

        StringBuilder tmp = new StringBuilder();
        Map.Entry<Character, Integer> pre = null;
        Map.Entry<Character, Integer> cur = null;

        while (!mA.isEmpty()) {
            pre = mA.entrySet().iterator().next();
            cur = mA.entrySet().iterator().next();

            if (cur.getValue() == 0) {
                mA.remove(cur.getKey());
                continue;
            }

            tmp.append(cur.getKey()).append((char) (cur.getKey() + 32));
            cur.setValue(cur.getValue() - 1);
            pre = cur;

            while (cur != null && cur.getValue() > 0 && cur.getKey() == pre.getKey() + 1) {
                tmp.append(cur.getKey()).append((char) (cur.getKey() + 32));
                cur.setValue(cur.getValue() - 1);
                pre = cur;
                cur = mA.higherEntry(cur.getKey());
            }

            System.out.println(tmp.toString());
            tmp.setLength(0);
        }
    }
}
 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值