题解 | #查找兄弟单词#

查找兄弟单词

https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String a;
        try {
            a = r.readLine();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        char[] chs = a.toCharArray();
        int i = 0, j = 0, n = 0, k = 0, in1 = 0, strl = 0, strIn, strCm, add, num = 0,
            t = 0, ans = 0;
        while (i < chs.length) {
            if (chs[i] == ' ') {
                i++;
                break;
            }
            n = n * 10;
            n += chs[i] - '0';
            i++;
        }
        int[][] chIn = new int[n + 1][2];
        while (i < chs.length) {
            if (k == 0) in1 = i;//长度为0,表示i为开始索引值
            if (j == n + 1) break;
            if (chs[i] == ' ') {
                chIn[j][0] = in1;//存储开始索引
                chIn[j][1] = k;//存储长度
                i++;
                j++;//索引数组自增
                k = 0;//长度重置为0
                continue;
            }
            k++;//非空格字符串长度自增
            i++;
        }
        while (i < chs.length) {
            k = k * 10;
            k += chs[i] - '0';
            i++;
        }
        i = 0;
        int[] cnt = new int[128];
        int[] bro = new int[n];
        while (i < n) {
            strl = chIn[n][1];//被比较字符串长度
            strIn = chIn[n][0];//被比较字符串开始索引
            strCm = chIn[i][0];//比较字符串开始索引
            if (strl == chIn[i][1] && noEql(chs, strCm, strIn, strl)) {
                j = 0;
                while (j < strl) {//兄弟单词,字母下标对消
                    ++cnt[chs[strIn + j]];
                    --cnt[chs[strCm + j]];
                    j++;
                }
                j = 0;
                add = 1;
                while (j < strl) {
                    if (cnt[chs[strIn + j]] != 0 ||
                            cnt[chs[strCm + j]] != 0) {//有非0元素,表示不是兄弟单词
                        cnt[chs[strIn + j]] = 0;//重置为0
                        cnt[chs[strCm + j]] = 0;//重置为0
                        if (add == 1) add = 0;
                    }
                    j++;
                }
                if (add == 1) bro[num++] =
                        chIn[i][0];//兄弟单词,兄弟单词个数num自增
            }
            i++;
        }
        i = 0;
        while (i < num - 1) {
            j = 0;
            while (j < num - 1 - i) {
                if (comp(chs, bro[j], bro[j + 1], strl)) {
                    t = bro[j];
                    bro[j] = bro[j + 1];
                    bro[j + 1] = t;
                }
                j++;
            }
            i++;
        }
        if (k <= num) {
            ans = bro[k - 1];
            System.out.print(num + "\n" + a.substring(ans, ans + strl));
        } else System.out.print(num);
    }

    //比较两字符串是否不相同
    public static boolean noEql(char[] chs, int a, int b, int l) {
        int m = 0;
        boolean res = false;
        while (m < l) {
            if (chs[a + m] != chs[b + m]) {
                res = true;
                break;
            }
            m++;
        }
        return res;
    }

    //比较大小
    public static boolean comp(char[] chs, int i1, int i2, int len) {
        int v = 0;
        boolean b = false;
        while (v < len) {
            if (chs[i1 + v] > chs[i2 + v]) {
                b = true;
                break;
            } else if (chs[i1 + v] == chs[i2 + v]) {
                v++;
                continue;
            } else break;
        }
        return b;
    }
}

全部评论

相关推荐

03-20 11:10
已编辑
大连民族大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务