ลบจดหมายเพื่อทำ palindrome


15

ปัญหา

สมมติว่าคำหนึ่งคำนั้นเกือบจะเป็นpalindromeถ้ามันเป็นไปได้ที่จะเอาตัวอักษรตัวใดตัวหนึ่งออกมาเพื่อที่ว่าคำนั้นจะกลายเป็น palindrome งานของคุณคือการเขียนโปรแกรมสำหรับคำที่กำหนดจะกำหนดตัวอักษรที่จะลบเพื่อให้ได้สีที่เหมาะสม

รหัสที่สั้นที่สุดที่จะทำเช่นนี้ในภาษาการเขียนโปรแกรมใด ๆ ที่ชนะ

อินพุต

ข้อมูลที่ป้อนประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่จาก 2 ถึง 1,000 ตัวอักษร

เอาท์พุต

เอาท์พุทตำแหน่งที่จัดทำดัชนี 1 (ตัวอักษรซ้ายสุดมีตำแหน่ง 1 ตำแหน่งถัดไปมีตำแหน่ง 2 และอื่น ๆ ) ของตัวอักษรที่ควรลบออก หากมีตัวเลือกที่เป็นไปได้ที่นำไปสู่ ​​palindrome เอาท์พุทตำแหน่งใด ๆ เหล่านั้น โปรดทราบว่าคุณจะต้องลบตัวอักษรแม้ว่าคำที่กำหนดจะเป็นแบบ palindrome อยู่แล้ว หากคำที่กำหนดไม่ใกล้เคียงกับ Palindrome ให้เอาท์พุท -1


ตัวอย่าง

อินพุต:

racercar

อาจสร้างผลลัพธ์:

5

เพราะการลบ5ตัวอักษรที่ผลิตออกracecarมาซึ่งเป็น palindrome

นอกจากนี้ยังมีอินพุต

racecar

ยังสามารถผลิตผลลัพธ์

4

เพราะการเอา4จดหมายฉบับที่ผลิตออกไปraccarนั้นยังคงเป็นปัญหา


5
ไม่มีตัวอย่างโพสต์? และสิ่งที่จะส่งออกถ้ามันเป็นไปไม่ได้ที่จะทำให้การป้อนข้อมูลใน Palindrome?
ProgrammerDan

3
@ Arm103 คุณยังขาดตัวอย่างที่คุณอ้างถึง
Martin Ender

27
คำเตือน: "(ดูตัวอย่าง 3)" นี่เป็นการชี้ให้เห็นว่านี่เป็นการบ้านเนื่องจากไม่มีตัวอย่างที่เคยโพส
Justin

3
@Quincunx ให้แน่ใจว่าได้อ่านเธรดในการส่ง Mathematica ด้วย :-)
Chris Jester-Young

3
คำถามนี้ดูเหมือนจะไม่อยู่ในหัวข้อเนื่องจากตัวอย่างที่ 3หายไปจากคำถาม
devnull

คำตอบ:


10

J - 31 25 ตัวอักษร

(_1{ ::[1+[:I.1(-:|.)\.])

ค่าโดยสารมาตรฐานส่วนใหญ่สำหรับ J ดังนั้นฉันจะชี้ให้เห็นบิตที่น่าสนใจ

  • คำวิเศษณ์\.ที่เรียกว่าOutfix x u\. yลบความยาวทุกอันxออกจากyและนำuไปใช้กับผลลัพธ์ของการลบแต่ละครั้ง นี่xคือ 1 yคือสตริงอินพุตและuคือ(-:|.)การทดสอบว่าสตริงตรงกับกลับหรือไม่ ดังนั้นผลลัพธ์ของแอปพลิเคชั่นนี้\.คือรายการของ booleans 1 ในตำแหน่งของอักขระแต่ละตัวที่การลบทำให้อินพุตเป็น palindrome

  • I.สร้างรายการของดัชนีทั้งหมด (0-origin) จากด้านบนซึ่งมี 1 การเพิ่ม 1 ด้วย1+ทำให้ 1 ดัชนีที่มาเหล่านี้ หากไม่มีดัชนีเท่ากับ 1 รายการนั้นจะว่างเปล่า _1{ตอนนี้เราพยายามที่จะใช้องค์ประกอบสุดท้ายด้วย (เราได้รับอนุญาตให้ส่งออกใด ๆ ของตัวอักษรที่ถอดออกได้!) หากงานนี้เรากลับ แต่ถ้ารายการเป็นที่ว่างเปล่ามีองค์ประกอบที่ไม่ทั้งหมดดังนั้น{โยนข้อผิดพลาดโดเมนที่เราจับด้วย::และกลับ -1 [กับ

การใช้งาน (จำได้ว่าNB.มีไว้สำหรับความคิดเห็น):

   (_1{ ::[1+[:I.1(-:|.)\.]) 'RACECAR'    NB. remove the E
4
   (_1{ ::[1+[:I.1(-:|.)\.]) 'RAACECAR'   NB. remove an A
3
   (_1{ ::[1+[:I.1(-:|.)\.]) 'RAAACECAR'  NB. no valid removal
_1

ฉันควรเรียนรู้ J. บทเรียนใด ๆ สำหรับโปรแกรมเมอร์หลาม?
Aprıʇǝɥʇuʎs

1
@Synthetica เจ้าหน้าที่คนนั้นดีมาก
John Dvorak

2
@Synthetica ไม่มีอะไรพิเศษสำหรับ Pythoners แต่J สำหรับ C โปรแกรมเมอร์เป็นทรัพยากรที่ยอดเยี่ยมสำหรับทุกคนที่ย้ายจากการเขียนโปรแกรมที่จำเป็น
algorithmshark

10

ไม่ใช่ PHP Python (73):

[a[:g]+a[g+1:]==(a[:g]+a[g+1:])[::-1] for g in range(len(a))].index(1)

โดยที่ a คือสตริงที่คุณต้องการตรวจสอบ อย่างไรก็ตามสิ่งนี้จะเกิดข้อผิดพลาดหากคุณไม่สามารถหมุนเป็นแบบสีเดียว คุณสามารถใช้แทน

try:print [a[:g]+a[g+1:]==(a[:g]+a[g+1:])[::-1] for g in range(len(a))].index(True)
except ValueError:print -1

แก้ไข: ไม่เดี๋ยวก่อนมันใช้งานได้!

try: eval("<?php $line = fgets(STDIN); ?>")
except: print [a[:g]+a[g+1:]==(a[:g]+a[g+1:])[::-1] for g in range(len(a))].index(1)

ขอบคุณสิ่งนี้จะเพิ่มเนื้อหา php ของสคริปต์นี้ประมาณ 25% (นั่นคือสิ่งที่คุณต้องการใช่ไหม?)


10
+1 สำหรับ "Not PHP";)
Martin Ender

1
<? php $ line = fgets (STDIN); ?>
011001

2
@ User011001 นั่นเหมาะกับอะไร?
Aprıʇǝɥʇuʎs

1
คุณสามารถประหยัดถ่านโดยการเขียน1>0แทนTrueและโดยการลบช่องว่างระหว่าง]และforใน...[::-1] for g...
Kaya

1
@Kaya คุณสามารถใช้1แทนได้Trueเช่นกัน 1 == True, หลังจากนั้น.
arshajii

5

Mathematica, 106 98 87 91 ตัวละคร

ฉันคิดว่าฉันเป็นคนพิการเล็กน้อยจากชื่อฟังก์ชันยาว ๆ แต่ปัญหาเช่นนี้ค่อนข้างสนุกใน Mathematica:

f=Tr@Append[Position[c~Drop~{#}&/@Range@Length[c=Characters@#],l_/;l==Reverse@l,{1}],{-1}]&

มันส่งสัญญาณเตือนบางอย่างเพราะl_รูปแบบนั้นตรงกับตัวละครทุกตัวที่อยู่ภายในซึ่งReverseไม่สามารถใช้งานได้ แต่เฮ้มันใช้งานได้!

ค่อนข้างอวดดี:

f[s_] := 
  Append[
    Cases[
      Map[{#, Drop[Characters[s], {# }]} &, Range[StringLength[s]]], 
      {_, l_} /; l == Reverse[l]
    ], 
    {-1}
  ][[1, 1]]

2
@ Arm103 ฉันทำได้ แต่ฉันจะปล่อยให้คนอื่น ;)
Martin Ender

2
@ Arm103 รอนี่เป็นการบ้านของคุณหรือเปล่า?
จอห์น Dvorak

2
@JanDvorak มีหลักสูตร CS ที่ใช้ PHP หรือไม่ นั่นคงจะน่ากลัว
Chris Jester-Young

2
@ Arm103 หมายเลข คุณไม่สามารถ ;-)
John Dvorak

4
@JanDvorak hmmm โปรแกรมใน Mathematica คืออะไร
Martin Ender

5

GolfScript, 28 26 ตัวอักษร

:I,,{)I/();\+.-1%=}?-2]0=)

ขอบคุณ Peter ที่ทำให้สั้นลงด้วย 2 ตัวอักษร ลองทดสอบกรณีออนไลน์ :

> "RACECAR" 
4
> "RAACECAR" 
2
> "RAAACECAR" 
-1
> "ABCC1BA" 
5
> "AAAAAA" 
1
> "ABCDE" 
-1
> "" 
-1
> "A" 
1

คาดเดาว่าจะต้องมีวิธีที่สั้นกว่า แต่ฉันไม่พบมัน
Howard

RACECARยังคงเป็น palindrome ของ E หรือไม่จำเป็นต้องระบุอักขระที่ต้องการลบเมื่อคำที่ป้อนเป็น palindrome แล้วหรือไม่
ลุง

@ unclemeat ใช่ ประโยคสุดท้ายของสเป็ค
Peter Taylor

ทำไม-2]$-1=)? -2]0=)ในช่วงเริ่มต้นของบล็อกที่คุณมีอย่างหนึ่งรายการมากที่สุดในสแต็คเพื่อให้คุณสามารถลดได้อย่างง่ายดายเพื่อ (หรือความยาวเท่ากัน]-2or)ฉันเรียนรู้ที่จะรักorในกรณีพิเศษ)
Peter Taylor

2
@Howard ถ้าฉันมีนิกเกิลทุกครั้งที่ฉันรู้สึกแบบนั้นเกี่ยวกับ Golfscript ...
algorithmshark

3

รีโบล (81)

r: -1 repeat i length? s[t: head remove at copy s i if t = reverse copy t[r: i]]r

ตัวอย่างการใช้งานในคอนโซล Rebol:

>> s: "racercar"
== "racercar"

>> r: -1 repeat i length? s[t: head remove at copy s i if t = reverse copy t[r: i]]r
== 5

>> s: "1234"
== "1234"

>> r: -1 repeat i length? s[t: head remove at copy s i if t = reverse copy t[r: i]]r 
== -1


ผลตอบแทนดังกล่าวข้างต้นดัชนีของ palindrome พบ ทางเลือกอื่น (85 ตัวอักษร) ซึ่งให้ผลลัคกี้ทุกครั้งที่พบคือ:

collect[repeat i length? s[t: head remove at copy s i if t = reverse copy t[keep i]]]

ดังนั้นสำหรับเรื่องนี้จะกลับรายการ"racercar"[4 5]


ถ้าคุณใช้ภาษา Rebmuว่าการแก้ปัญหาแรกคือเพียงแค่ 37 ตัวอักษรแม้จะเป็นพื้นรหัสเดียวกัน :-) วิงวอนเป็นrebmu / args "Rng01rpNl หรือไม่ [ThdRMatCYaNieTrvCYt [Rn]] r" "รถแข่ง" โปรดทราบว่าเอกสาร Rebmu ได้รับการปรับปรุงและการเปลี่ยนแปลงล่าสุดได้ทำให้มันกระชับขึ้นเล็กน้อย ... ยังคงต้องการความคิดเห็นก่อนที่ทุกคนและ D ของพวกเขาจะเริ่มใช้มัน :-)
HostileFork พูดว่าไม่เชื่อถือ SE

3

C #, 134 ตัวอักษร

static int F(string s,int i=0){if(i==s.Length)return-1;var R=s.Remove(i,1);return R.SequenceEqual(R.Reverse())?i+1:F(s,i+1);}

ฉันรู้ว่าฉันแพ้:(แต่มันก็ยังสนุก: D

รุ่นที่อ่านได้:

using System.Linq;

// namespace and class

static int PalindromeCharIndex(string str, int i = 0)
{
    if (i == str.Length) return -1;
    var removed = str.Remove(i, 1);
    return removed.SequenceEqual(removed.Reverse()) 
        ? i+1
        : PalindromeCharIndex(str, i + 1); 
}

3
สนุกจัง !!!!! :)
Almo

1
ในเวอร์ชัน golfed มีการRกำหนดและใช้งานที่ไหน
แปรงสีฟัน

โอ้ใช่มันควรจะบอกว่าvar R = s.Remove (i, 1) จับดี
Will Newton

3

Stax , 8 10 ไบต์

ú·àA÷¡%5Ñ╙

เรียกใช้และแก้ไขข้อบกพร่อง

โปรแกรมนี้จะแสดงดัชนีที่ใช้ 1 ทั้งหมดที่สามารถลบออกจากสตริงในรูปแบบ palindrome และถ้าไม่มีก็จะแสดง -1


2
นี่จะแสดงดัชนีสุดท้ายแทน -1 หากไม่พบ Palindrome (เช่นaaabbเอาท์พุท5แทน-1)
Kevin Cruijssen

1
@KevinCruijssen: ใช่แล้วล่ะ ฉันแก้ไขมันที่ราคา 2 ไบต์
เรียกซ้ำ

2

ทับทิม (61):

(1..s.size+1).find{|i|b=s.dup;b.slice!(i-1);b.reverse==b}||-1

ที่นี่มีทางออกทับทิม มันจะกลับตำแหน่งของตัวละครที่จะลบหรือ -1 ถ้ามันไม่สามารถทำได้

ฉันไม่สามารถช่วยได้ แต่รู้สึกว่ามีการปรับปรุงที่จะทำกับส่วนที่สองและชิ้นส่วน แต่ทับทิมไม่ปรากฏว่ามีวิธีการสตริงที่จะลบตัวอักษรที่ดัชนีเฉพาะและส่งกลับสตริงใหม่ -__-

แก้ไขตามความคิดเห็น ty!


1
คุณสามารถประหยัดพื้นที่ได้โดยไม่ห่อในฟังก์ชั่น / วิธี อย่างไรก็ตามในปัจจุบันรหัสของคุณส่งคืนดัชนีแบบ 0 (ต้องเป็นแบบ 1) และจะต้องส่งคืน-1หากไม่พบ Palindrome
draegtun

แก้ไข-1ขอบคุณ ไม่แน่ใจว่าสิ่งที่คุณมีอยู่ในใจเกี่ยวกับการใช้วิธีการฉันจะคิด
Mike Campbell

ตกลงเอาคำแนะนำของคุณขึ้นเครื่องแล้วเขียนใหม่ :)
Mike Campbell

ยินดีต้อนรับคุณ! ตอนนี้มันดีกว่ามาก :) +1
draegtun

2

05AB1E , 10 ไบต์

gL.Δõs<ǝÂQ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

g           # Get the length of the (implicit) input-string
 L          # Create a list in the range [1,length]
          # Find the first value in this list which is truthy for:
            # (which will output -1 if none are truthy)
    õ       #  Push an empty string ""
     s      #  Swap to get the current integer of the find_first-loop
      <     #  Decrease it by 1 because 05AB1E has 0-based indexing
       ǝ    #  In the (implicit) input-String, replace the character at that index with
            #  the empty string ""
        Â   #  Then bifurcate the string (short for Duplicate & Reverse copy)
         Q  #  And check if the reversed copy is equal to the original string,
            #  So `ÂQ` basically checks if a string is a palindrome)
            # (after which the result is output implicitly)


1

Haskell, 107 ตัวอักษร:

(x:y)!1=y;(x:y)!n=x:y!(n-1)
main=getLine>>= \s->print$head$filter(\n->s!n==reverse(s!n))[1..length s]++[-1]

ในฐานะที่เป็นฟังก์ชั่น ( 85 ตัวอักษร ):

(x:y)!1=y;(x:y)!n=x:y!(n-1)
f s=head$filter(\n->s!n==reverse(s!n))[1..length s]++[-1]

เวอร์ชัน ungolfed เดิม:

f str = case filter cp [1..length str] of
          x:_ -> x
          _   -> -1
    where cp n = palindrome $ cut n str
          cut (x:xs) 1 = xs
          cut (x:xs) n = x : cut xs (n-1)
          palindrome x = x == reverse x

1

C # (184 ตัวอักษร)

ฉันยอมรับว่านี่ไม่ใช่ภาษาที่ดีที่สุดในการเล่นรหัส ...

using System.Linq;class C{static void Main(string[]a){int i=0,r=-1;while(i<a[0].Length){var x=a[0].Remove(i++,1);if(x==new string(x.Reverse().ToArray()))r=i;}System.Console.Write(r);}}

จัดรูปแบบและแสดงความคิดเห็น:

using System.Linq;

class C
{
    static void Main(string[] a)
    {
        int i = 0, r = -1;
        // try all positions
        while (i < a[0].Length)
        {
            // create a string with the i-th character removed
            var x = a[0].Remove(i++, 1);
            // and test if it is a palindrome
            if (x == new string(x.Reverse().ToArray())) r = i;
        }
        Console.Write(r);
    }
}

1

C # (84 ตัวอักษร)

int x=0,o=i.Select(c=>i.Remove(x++,1)).Any(s=>s.Reverse().SequenceEqual(s))?x:-1;

คำสั่ง LINQpad คาดหวังว่าตัวแปรiจะมีสตริงอินพุต เอาต์พุตถูกเก็บในoตัวแปร


1

Haskell, 80

a%b|b<1=0-1|(\x->x==reverse x)$take(b-1)a++b`drop`a=b|1<2=a%(b-1)
f a=a%length a

เรียกว่าเป็นแบบนี้:

λ> f "racercar"
5


0

Haskell, 118C

m s|f s==[]=(-1)|True=f s!!0
f s=[i|i<-[1..length s],r s i==(reverse$r s i)]
r s i=let(a,_:b)=splitAt (i-1) s in a++b

Ungolfed:

fix s
    |indices s==[] = (-1)
    |True = indices s!!0
indices s = [i|i<-[1..length s],remove s i==(reverse$remove s i)]
remove s i = let (a,_:b) = (splitAt (i-1) s) in a++b

0

เยลลี่ , 17 14 ไบต์

ŒPṖLÐṀṚŒḂ€TXo-

ลองออนไลน์!

           X      A random
          T       truthy index
ŒP                from the powerset of the input
  Ṗ               excluding the input
   LÐṀ            and all proper subsequences with non-maximal length
      Ṛ           reversed
       ŒḂ€        with each element replaced with whether or not it's a palindrome,
            o-    or -1.

เนื่องจากฉันเปลี่ยนวิธีการของฉันเร็วพอสำหรับเวอร์ชันเก่าที่จะไม่แสดงในประวัติการแก้ไขนี่คือ: ŒPṚḊŒḂ€TṂ©’<La®o-


0

Brachylogขนาด 24 ไบต์

{l+₁≥.ℕ₂≜&↔⊇ᶠ↖.tT↔T∨0}-₁

ลองออนไลน์!

รู้สึกยาวเกินไป

อาจสั้นลงสองไบต์หากผลลัพธ์อาจมีดัชนีแบบ 2 :

l+₁≥.ℕ₂≜&↔⊇ᶠ↖.tT↔T∨_1

การทำซ้ำสองครั้งก่อนหน้านี้และแย่ยิ่งกว่า:

ẹ~c₃C⟨hct⟩P↔P∧C;Ȯ⟨kt⟩hl<|∧_1
l>X⁰ℕ≜<.&{iI¬tX⁰∧Ih}ᶠP↔P∨_1

ใช้หลังของตัวแปรทั่วโลกมีความจำเป็นส่วนหัวของการทดสอบที่แตกต่างกัน


0

Python 3 , 71 ไบต์

def f(s,i=1):n=s[:i-1]+s[i:];return(n==n[::-1])*i-(i>len(s))or f(s,i+1)

ลองออนไลน์!

ส่งคืนอักขระ 1 ที่จัดทำดัชนีหากการดำเนินการสามารถทำได้และเป็น-1อย่างอื่น


0

ภาษา Wolfram (Mathematica) , 56 ไบต์

FirstCase[Range@Tr[1^#],a_/;PalindromeQ@Delete[#,a],-1]&

ลองออนไลน์!

รับอินพุตเป็นรายการของอักขระ @*Charactersสำหรับการป้อนข้อมูลสตริงผนวก

PalindromeQถูกนำมาใช้ในปี 2015 ทางเลือกที่มีค่าใช้จ่ายที่ 4 ไบต์



0

C (gcc) , 180 168 159 157 140 139 ไบต์

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;)p=s[i++]^s[j--]&&!++p?s[i]-s[j+1]?s[i-1]-s[j]?p:j--+2:i++:p;return p<0?m+1:p?p:-1;}

ลองออนไลน์!

2 16 17 bytes โกนหนวดออกต้องขอบคุณ catcat! และอีก 3 ไบต์เนื่องจากกฎระบุความยาวขั้นต่ำของอินพุตคือ 2 ตัวอักษรดังนั้นไม่จำเป็นต้องตรวจสอบสตริงว่าง

Ungolfed:

f(char *s) {
  int j = strlen(s);             // j = length of input
  int m = j-- / 2;               // m = midpoint of string,
                                 // j = index of right character
  int p = -1;                    // p = position of extra character
                                 //     -1 means no extra character found yet
                                 //     0 means invalid input
  int i = 0;                     // i = index of left character

  for (; p && i < m; i++) {      // loop over the string from both sides,
                                 // as long as the input is valid.
    p = s[i] ^ s[j--]            // if (left character != right character
        && !++p ?                //     and we didn't remove a character yet*)
          s[i + 1] - s[j + 1] ?  //   if (left+1 char != right char)
            s[i] - s[j] ?        //     if (left char != right-1 char)
              p                  //       do nothing,
            :                    //     else
              j-- + 2            //       remove right char.
          :                      //   else
            ++i                  //       remove left char.
        :                        // else
          p;                     //     do nothing, or:
                                 //     *the input is marked invalid 
  } 

  return p < 0 ?                 // if (input valid and we didn't remove a character yet)
           m + 1                 //   return the midpoint character,
         :                       // else
           p ?                   //   if (we did remove a character)
             p                   //     return that character,
           :                     //   else
             -1;                 //     the input was invalid.
}
```

@ceilingcat นั่น&&!++pเป็นเพียงการอธิบายที่ชัดเจน :)
G. Sliepen

-1

Python, 84

for i in range(len(s)):
    if s[i]!=s[-(i+1)]:
        if s[i]!=s[-(i+2)]:
            return i+1
        else:
            return len(s)-i

สิ่งนี้ไม่ได้ตรวจสอบว่าอินพุต (สตริง s) เกือบจะเป็น palindrome แต่มีเวลาที่มีประสิทธิภาพและสามารถอ่านได้


2
s[-(i+1)]s[-i-1]สามารถลงไป นอกจากนี้ฉันไม่แน่ใจ แต่คุณอาจแทนที่if...else...ด้วยreturn i+1 if ... else len(s)-1
user12205

มันใช้งานได้ดีใครจะอธิบายตรรกะเบื้องหลังนี้ได้ไหม
Arindam Roychowdhury

ความต้องการคือมันส่งออก -1 ถ้าการป้อนข้อมูลไม่ได้เป็น Palindrome ด้วยตัวอักษรพิเศษ ตัวอย่างเช่นถ้าs = "abcde"มันควรกลับ -1
G. Sliepen

-2

รหัสกอล์ฟครั้งแรกของฉัน

ชวา ~ 1200 ตัวอักษรในฟังก์ชั่นหลัก (และย่อย) ใช่ที่รัก.

ชั้นบนสุดและการใช้งาน:

public class ElimOneCharForPalindrome  {
   public static final void main(String[] ignored)  {
      System.out.println(getEliminateForPalindromeIndex("racercar"));
      System.out.println(getEliminateForPalindromeIndex("racecar"));
   }

ฟังก์ชั่นหลัก:

   public static final int getEliminateForPalindromeIndex(String oneCharAway_fromPalindrome)  {
      for(int i = 0; i < oneCharAway_fromPalindrome.length(); i++)  {
         String strMinus1Char = oneCharAway_fromPalindrome.substring(0, i) + oneCharAway_fromPalindrome.substring(i + 1);

         String half1 = getFirstHalf(strMinus1Char);
         String half2Reversed = getSecondHalfReversed(strMinus1Char);

         if(half1.length() != half2Reversed.length())  {
            //One half is exactly one character longer
            if(half1.length() > half2Reversed.length())  {
               half1 = half1.substring(0, (half1.length() - 1));
            }  else  {
               half2Reversed = half2Reversed.substring(0, (half2Reversed.length() - 1));
            }
         }

         //System.out.println(i + " " + strMinus1Char + " --> " + half1 + " / " + half2Reversed + "  (minus the singular [non-mirrored] character in the middle, if any)");

         if(half1.equals(half2Reversed))  {
            return  i;
         }
      }
      return  -1;
   }

Sub-ฟังก์ชั่น:

   public static final String getFirstHalf(String whole_word)  {
      return  whole_word.substring(0, whole_word.length() / 2);
   }
   public static final String getSecondHalfReversed(String whole_word)  {
      return  new StringBuilder(whole_word.substring(whole_word.length() / 2)).reverse().toString();
   }
}

ชั้นเต็ม:

public class ElimOneCharForPalindrome  {
   public static final void main(String[] ignored)  {
      System.out.println(getEliminateForPalindromeIndex("racercar"));
      System.out.println(getEliminateForPalindromeIndex("racecar"));
   }
   public static final int getEliminateForPalindromeIndex(String oneCharAway_fromPalindrome)  {
      for(int i = 0; i < oneCharAway_fromPalindrome.length(); i++)  {
         String strMinus1Char = oneCharAway_fromPalindrome.substring(0, i) + oneCharAway_fromPalindrome.substring(i + 1);

         String half1 = getFirstHalf(strMinus1Char);
         String half2Reversed = getSecondHalfReversed(strMinus1Char);

         if(half1.length() != half2Reversed.length())  {
            //One half is exactly one character longer
            if(half1.length() > half2Reversed.length())  {
               half1 = half1.substring(0, (half1.length() - 1));
            }  else  {
               half2Reversed = half2Reversed.substring(0, (half2Reversed.length() - 1));
            }
         }

         //System.out.println(i + " " + strMinus1Char + " --> " + half1 + " / " + half2Reversed + "  (minus the singular [non-mirrored] character in the middle, if any)");

         if(half1.equals(half2Reversed))  {
            return  i;
         }
      }
      return  -1;
   }
   public static final String getFirstHalf(String whole_word)  {
      return  whole_word.substring(0, whole_word.length() / 2);
   }
   public static final String getSecondHalfReversed(String whole_word)  {
      return  new StringBuilder(whole_word.substring(whole_word.length() / 2)).reverse().toString();
   }
}

3
สิ่งนี้ไม่แสดงความพยายามในการตีกอล์ฟ
mbomb007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.