【问题标题】:Get Palindrome of a String with replacement获取带替换的字符串回文
【发布时间】:2016-11-24 01:09:30
【问题描述】:

Elina 有一个字符串 S,由小写英文字母组成(即 a-z)。她可以用任何其他字符替换字符串中的任何字符,并且可以多次执行此替换。她想从 s 创建一个回文字符串 p ,使得字符串 p 包含子字符串 linkedin 。保证 Elina 可以从 S 创建回文字符串 p。 找到从 S 创建回文字符串 p 所需的最小操作数。 示例测试用例是:

第一个测试用例:S="linkedininininin"

解释:

            linkedin (i) (n) (i) (n) (i) ni (n)

                     (n) (i) (d) (e) (k)    (l)  

            p =  "linkedinnideknil" 

输出为 6

第二个测试用例:S="fulrokxeuolnzxltiiniabudyyozvulqbydmaldbxaddmkobhlplkaplgndnksqidkaenxdacqtsskdkdddls"

输出为 46

这里我无法获得第二个测试用例输出,它是如何获得输出 46 的。

第三个测试用例:

              S="linkaeiouideknil"

              P="linkedinnideknil" 
    Output = 4 

【问题讨论】:

  • 第二个测试用例是样本用例还是来自输入集? OJ 应该给出更小更简单的样本案例来分析。
  • S="linkaeiouideknil", P="linkedinnideknil" 最终输出 = 4

标签: string algorithm


【解决方案1】:

这是时间复杂度为 O(n) 的代码。

import java.io.*;
import java.util.*;

class TestClass {
    public static void main(String args[] ) throws Exception {
     Scanner sc = new Scanner(System.in);
     String input = sc.next();
     String ln = "linkedin";
     String rln= "nideknil";
     int limit, limit2;
     int len = input.length(); 

  if(len%2==0){
      limit=len/2-7;
      limit2=len/2-1;
  }else{
      limit=(len+1)/2-7;
      limit2= (len-1)/2 -1;
  }
  int max=0,index=0;
 boolean  rev=false;
  for(int i = 0; i<=len-8;i++){
       int count1=0, count2=0;

      if(i==limit){
          if(len%2==0){
              i=len/2;

          }else{
              i=(len-1)/2;
          }

      }

     String temp=input.substring(i,i+8);

      for(int j=0;j<8;j++){
          if(ln.charAt(j)==temp.charAt(j)){
              count1++;
          }
          if(rln.charAt(j)==temp.charAt(j)){
              count2++;
          }
          int temp2 = count1 > count2 ? count1 : count2;

          if(temp2>max){
              index=i;
              max=temp2;
              if(temp2==count2){
                  rev=true;
              }
              else 
              rev=false;
          }

      }
  }

  int replace=0;
  char in[]= input.toCharArray();
  int i,j;

  for(i= index,j=0;i<index+8;j++,i++){
   if(rev){
       if(rln.charAt(j)!=in[i]){
           replace++;

           in[i]=rln.charAt(j);
       }
   } else{
        if(ln.charAt(j)!=in[i]){
           replace++;

           in[i]=ln.charAt(j);
       }
     }  
  }

     for(j=0,i = len-1; j<=limit2 ;i--,j++){
        if(in[i]!=in[j]){
            replace++;
        }
   }


       System.out.println(replace);
    }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2012-05-20
    • 1970-01-01
    • 2023-03-16
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多