Topcoder_151

【问题描述】
    给定一个字符串,你必须通过交换两个不同位置的字母来得到一个新的字符串(两个字母可能是相同的)。比如,对于字符串"aba"通过以上规则能够得到字符串"baa", "aab", 或"aba"。你需要从中选择一个“最小”的字符串(按照字母顺序),此处应是"aab"。
    题目中给定2个字符串数组s1和s2。将s1和s2所有的元素串联起来得到原始字符串。需要返回一个包含2个元素的整数数组,其中标识了在原始字符串中待替换的2个字符的索引(以0开始)。如果存在多种结果,那么返回索引值最小的结果。

  定义:
类  LetterInterchange
方法  public int[] interchangeWhich(String[] s1, String[] s2)

  约束:
1、s1和s2均包含1至50个元素
2、每个元素均包含1至50个字母(a-z)

  测试用例:
1、{"a", "b", "a"}  {"c", "a", "b", "a"}  Returns: {1, 6 }
2、{"aa"}  {"bb"}  Returns: {0, 1 }
3、{"a"}  {"b", "c"}  Returns: {1, 2 }
4、{"aa"}  {"b", "bcc"}  Returns: {0, 1 }
  1. public class LetterInterchange {
  2.     public int[] interchangeWhich(String[] s1, String[] s2) {
  3.         int[] res = new int[2];
  4.         StringBuilder sb = new StringBuilder();
  5.         for (String string : s1) {
  6.             sb.append(string);
  7.         }
  8.         for (String string : s2) {
  9.             sb.append(string);
  10.         }
  11.         
  12.         String src = sb.toString();
  13.         char c1, c2;
  14.         for (int i = 0; i < src.length(); i++) {
  15.             c1 = src.charAt(i);
  16.             res[0] = i;
  17.             for (int k = src.length() - 1; k > i; k--) {
  18.                 c2 = src.charAt(k);
  19.                 if (c1 > c2) {
  20.                     res[1] = k;
  21.                     return res;
  22.                 }
  23.             }
  24.         }
  25.         
  26.         for (int i = 0; i < src.length(); i++) {
  27.             c1 = src.charAt(i);
  28.             res[0] = i;
  29.             for (int k = i + 1; k < src.length(); k++) {
  30.                 c2 = src.charAt(k);
  31.                 if (c1 == c2) {
  32.                     res[1] = k;
  33.                     return res;
  34.                 }
  35.             }
  36.         }
  37.         
  38.         if(res[1]==0){
  39.             res[0]=src.length()-2;
  40.             res[1]=src.length()-1;
  41.         }
  42.         return res;
  43.     }
  44. }
【算法思想】
    本题主要分成三种情况:
1、如测试用例1,字符串为"abacaba",字符b可以和其后的3个a进行交换,结果都会使得到的串比较小,但是得到的3个串中只有b和最后一个a进行交换的时候最终结果最小。因此这种情况的时候,对于当前字符,需要和最后一个大于该字符的字符交换。
2、如测试用例2,字符串中的字符是有序递增的(可能有相同字符)。这种情况就需要找到2个相同的字符交换即可。
3、如测试用例3,字符串中的字符是严格递增的(没有相同的字符)。这种情况就需要交换最后2个字符即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值