Kattis Problem-Lektira

23 篇文章 0 订阅

Kattis Problem-Lektira

原题链接

题目类型:字符串、枚举
题意:

在一个字符串上任选两个位置进行切割将其分为 3 段,并将每一段进行反转,然后再按原来的顺序拼接起来。求通过该操作可以获得的字典序最小的字符串。

分析

因为题目的数据范围较小,所以可以暴力枚举所有切割点,然后选取字典序最小的那个。

代码
public static void solve() throws IOException {
    char[] s = next().toCharArray();
    char[] a = new char[51];
    char[] b = new char[51];
    char[] c = new char[51];
    
    char[] ans = new char[s.length];
    for (int i = 0, len = s.length; i < len; i++) ans[i] = 'z';
    
    for (int i = 0, len = s.length; i < len - 2; i++) {
        for (int j = i + 1; j < len - 1; j++) {
            for (int k = 0; k <= i; k++) a[k] = s[k];
            for (int k = 0; k < j - i; k++) b[k] = s[k + i + 1];
            for (int k = 0; k < len - j - 1; k++) c[k] = s[k + j + 1]; 
            
            char[] t = merge(a, i + 1, b, j - i, c, len - j - 1);
            
            if (compareTo(ans, t, len)) ans = t;
        }
    }
    
    for (int i = 0, len = s.length; i < len; i++) pw.print(ans[i]);
    pw.println();
    
} 

public static boolean compareTo(char[] a, char[] b, int len) {
    for (int i = 0; i < len; i++) {
        if (a[i] < b[i]) return false;
        if (a[i] > b[i]) return true;
    }
    return false;
}

public static char[] merge(char[] a, int aLen, char[] b, int bLen, char[] c, int cLen) {
    char[] re = new char[50];
    reverse(a, aLen);
    reverse(b, bLen);
    reverse(c, cLen);

    for (int i = 0, j = 0; j < aLen; i++, j++) re[i] = a[j];
    for (int i = aLen, j = 0; j < bLen; i++, j++) re[i] = b[j];
    for (int i = aLen + bLen, j = 0; j < cLen; i++, j++) re[i] = c[j];        
    
    return re;
}

public static void reverse(char[] a, int len) {
    for (int i = 0, j = len - 1; i <= j; i++, j--) {
        char c = a[i];
        a[i] = a[j];
        a[j] = c;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值