內容 :
一看題名,你就該知道,這次跟迴文脫不了關係!
若你不確定什麼是「迴文」,請看 Google 字典的解釋:
迴文 huíwén
一種修辭方式。
通過詞語反復迴環使用,表達二者互相依存或彼此制約的關係,
如“人人為我,我為人人”、“饒人不癡漢,癡漢不饒人”。
輸入說明 :
一筆測試資料一行,包含許許多多但總數不超過 1000 個的大小寫英文字母和標點符號。
不可思議的是,裡面不會有任何空白字元。
輸出說明 :
如果重新安排順序後,有辦法讓這一堆英文字母變成迴文的話,輸出「yes !」,否則輸出「no...」。
注意,大寫和小寫字母視為相同,即 A 和 a 是一樣的,並且,請忽視所有非英文字母的字元。
範例輸入:
ababa
bbaaa
Level
aaabbbcc
abcdefg
HowAreYouToday
A_man,_a_plan,_a_canal:_Panama.
範例輸出 :
yes !
yes !
yes !
no...
no...
no...
yes !
來源:高中生程式解題
想到一個方法
回覆刪除既然它是可以排列組合
那出現兩個單獨 就是錯的
有成雙成對 或只有一個單獨就是對的
Dim X(26)
Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
Line Input #1, N
N = LCase(N)
For i = 1 To 26: X(i) = 0: Next i
For i = 1 To Len(N)
M = Mid(N, i, 1)
If "a" <= M And M <= "z" Then X(Asc(M) - 96) = X(Asc(M) - 96) + 1
Next i
If check = True Then Print #2, "no..." Else Print #2, "yes !"
Loop
Close #2
Close #1
End
End Sub
Function check() As Boolean '判斷是否有兩個單獨出現
P = False
A = 0
For i = 1 To 26
If X(i) Mod 2 <> 0 Then A = A + 1
If A > 1 Then P = True
Next i
check = P
End Function
Dim ch As Boolean, F(26)
回覆刪除Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
Line Input #1, n
ch = False
For i = 1 To 26: F(i) = 0: Next
Call A1(n)
Call A2(n)
Loop
Close
Close
End
End Sub
Sub A1(a)
Dim NewA
For i = 1 To Len(a)
m = Mid(a, i, 1)
If m <= "z" And m >= "A" And m <> "_" Then m = UCase(m): NewA = NewA & m
Next
a = NewA
End Sub
Sub A2(a)
sp = Int(Len(a) / 2)
l = Left(a, sp)
R = Right(a, sp)
For i = 1 To Len(R)
m = Mid(R, i, 1)
nr = m & nr
Next
R = nr
If R = l Then
Print #2, "Yes !"
Else
For i = 1 To Len(a)
m = Mid(a, i, 1)
F(Asc(m) - 64) = F(Asc(m) - 64) + 1
Next
KK = 0
For i = 1 To 26
If F(i) Mod 2 <> 0 Then KK = KK + 1
Next
If KK = 1 Then Print #2, "Yes !" Else Print #2, "no..."
End If
End Sub
佑好,
回覆刪除程式ok,邏輯想法很好。
arro好,
程式可能有小錯誤,你在判斷非英文字母的地方,是不是有些偷懶,該用a-z,A-Z的,不可以直接A-z,中間的幾個例外,會有錯誤的機會。
還有,kk=0是不是應該也是yes!呢?