JAVA 算法练习(三)

拆解排序问题

后缀子串排序

题目:

对于一个字符串,将其后缀子串进行排序,例如grain 其子串有: grain rain ain in n 然后对各子串按字典顺序排序,即: ain,grain,in,n,rain

解题思路:

先将字符串经行拆解,然后将拆解后的字符串进行字典顺序排序

代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static String[] sT(String s) {
        String[] result = new String[s.length()];
        for (int i = 0; i < s.length(); i++)
            result[i] = s.substring(i); // 从i到末尾截取字符串
        Arrays.sort(result); // 进行字典顺序排序
        return result;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            String[] result = sT(s);
            for (String c : result) {
                System.out.println(c);
            }
        }
    }
}

子串计算

题目:

给出一个01字符串(长度不超过100),求其每一个子串出现的次数。对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。
例如:10101 ,输出结果为:

0 2
01 2
1 3
10 2
101 2

解题思路:

将字符串进行拆解,拆解方式不同于上一题,拆解结果为所有相邻的子串。再将拆解子串经行排序,然后输出。

代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            Map<String, Integer> count = new HashMap<>();
            String s = sc.nextLine();
            for (int i = 0; i < s.length(); i++) {
                for (int j = i + 1; j <= s.length();j++) {
                    String temp = s.substring(i, j); // substring 范围(i—(j-1))
                    if (count.get(temp) == null) {  // 查看该子串是否出现过,否则将其以key值添加到map中,value值为1
                        count.put(temp, 1);
                    } else {
                        int value = count.get(temp); // 是则提取该key值的value值,并使value值加1
                        count.put(temp, ++value);
                    }
                }
            }
            Collection<String> keys = count.keySet(); // 提取所有的key值
            List<String> list = new ArrayList<>(keys); 
            Collections.sort(list);  // 无第二个参数,默认升序
            for (String str : list) {
                if (count.get(str) > 1) {
                    System.out.println(str + " " + count.get(str));
                }
            }
        }
    }
}

附:吉他曲
流星——岸部真明

以上

posted @ 2017-06-18 10:25  梦想未必轻  阅读(506)  评论(0编辑  收藏  举报