获取替换字符串的Palindrome

时间:2016-10-16 12:19:30

标签: string algorithm

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 

1 个答案:

答案 0 :(得分: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);
    }
 }