gpt4 book ai didi

c# - 我如何找出最少数量的字符来创建回文?

转载 作者:可可西里 更新时间:2023-11-01 03:12:04 24 4
gpt4 key购买 nike

给定一个字符串,找出最少需要多少个字符才能使这个单词成为回文。示例:

ABBA : 0 (already a palindrome)ABB: 1FAE: 2FOO: 1

最佳答案

仅限算法,因为这可能是家庭作业 [向 Raymond 道歉,这是一个面试问题而不是家庭作业,正如他的编辑/评论所表明的那样。但是,算法和添加的伪代码对于该目的仍然有效,我在最后添加了一些 C 代码]。

您需要找到字符串末尾最长的回文。可以通过简单地从字符串的开头运行一个指针和从结尾运行一个指针来创建一种查看字符串是否为回文的算法,检查它们所指的字符是否相同,直到它们在中间相遇。像这样的东西:

function isPalindrome(s):
i1 = 0
i2 = s.length() - 1
while i2 > i1:
if s.char_at(i1) not equal to s.char_at(i2):
return false
increment i1
decrement i2
return true

尝试使用完整的字符串。如果这不起作用,将第一个字符保存在堆栈中,然后查看其余字符是否形成回文。如果这不起作用,请同时保存第二个字符并从第三个字符开始再次检查。

最终你会得到一系列保存的字符和剩下的字符串,这是一个回文。

最好的情况是原始字符串一个回文,在这种情况下堆栈将为空。最坏的情况是剩下一个字符(一个字符的字符串自动成为回文),而所有其他字符都在堆栈中。

您需要添加到原始字符串末尾的字符数是堆栈上的字符数。

要真正制作回文,将字符一个一个地从堆栈中弹出,并将它们放在回文字符串的开头和结尾。

例子:

String      Palindrome  Stack  Notes
------ ---------- ----- -----
ABBA Y - no characters needed.

String Palindrome Stack Notes
------ ---------- ----- -----
ABB N -
BB Y A one character needed.
ABBA Y - start popping, finished.

String Palindrome Stack Notes
------ ---------- ----- -----
FAE N -
AE N F
E Y AF two characters needed.
AEA Y F start popping.
FAEAF Y - finished.

String Palindrome Stack Notes
------ ---------- ----- -----
FOO N -
OO Y F one character needed.
FOOF Y - start popping, finished.

String Palindrome Stack Notes
------ ---------- ----- -----
HAVANNA N -
AVANNA N H
VANNA N AH
ANNA Y VAH three characters needed.
VANNAV Y AH start popping.
AVANNAVA Y H
HAVANNAVAH Y - finished.

String          Palindrome   Stack      Notes
------ ---------- -------- -----
deoxyribo N -
eoxyribo N d
oxyribo N ed
: : :
bo N iryxoed
o Y biryxoed eight chars needed.
bob Y iryxoed start popping.
ibobi Y ryxoed
: : :
oxyribobiryxo Y ed
eoxyribobiryxoe Y d
deoxyribobiryxoed Y - finished.

将此方法转换为“代码”:

function evalString(s):
stack = ""
while not isPalindrome(s):
stack = s.char_at(0) + stack
s = s.substring(1)
print "Need " + s.length() + " character(s) to make palindrome."
while stack not equal to "":
s = stack.char_at(0) + s + stack.char_at(0)
stack = stack.substring(1)
print "Palindrome is " + s + "."

对于那些对伪代码不太感兴趣的人,这里有一个用 C 编写的测试程序可以解决问题。

#include <stdio.h>
#include <string.h>

static char *chkMem (char *chkStr) {
if (chkStr == NULL) {
fprintf (stderr, "Out of memory.\n");
exit (1);
}
return chkStr;
}

static char *makeStr (char *oldStr) {
char *newStr = chkMem (malloc (strlen (oldStr) + 1));
return strcpy (newStr, oldStr);
}

static char *stripFirst (char *oldStr) {
char *newStr = chkMem (malloc (strlen (oldStr)));
strcpy (newStr, &(oldStr[1]));
free (oldStr);
return newStr;
}

static char *addFront (char *oldStr, char addChr) {
char *newStr = chkMem (malloc (strlen (oldStr) + 2));
sprintf (newStr, "%c%s", addChr, oldStr);
free (oldStr);
return newStr;
}

static char *addBoth (char *oldStr, char addChr) {
char *newStr = chkMem (malloc (strlen (oldStr) + 3));
sprintf (newStr, "%c%s%c", addChr, oldStr, addChr);
free (oldStr);
return newStr;
}

static int isPalindrome (char *chkStr) {
int i1 = 0;
int i2 = strlen (chkStr) - 1;
while (i2 > i1)
if (chkStr[i1++] != chkStr[i2--])
return 0;
return 1;
}

static void evalString (char *chkStr) {
char * stack = makeStr ("");
char * word = makeStr (chkStr);

while (!isPalindrome (word)) {
printf ("%s: no, ", word);
stack = addFront (stack, *word);
word = stripFirst (word);
printf ("stack <- %s, word <- %s\n", stack, word);
}
printf ("%s: yes, need %d character(s)\n", word, strlen (stack));

printf ("----------------------------------------\n");
printf ("Adjusting to make palindrome:\n");
while (strlen (stack) > 0) {
printf (" %s, stack <- %s\n", word, stack);
word = addBoth (word, *stack);
stack = stripFirst (stack);
}
printf (" %s\n", word);
printf ("========================================\n");

free (word);
free (stack);
}

int main (int argc, char *argv[]) {
int i;
for (i = 1; i < argc; i++) evalString (argv[i]);
return 0;
}

运行这个:

mkpalin abb abba fae foo deoxyribo

给出输出:

abb: no, stack <- a, word <- bb
bb: yes, need 1 character(s)
----------------------------------------
Adjusting to make palindrome:
bb, stack <- a
abba
========================================

abba: yes, need 0 character(s)
----------------------------------------
Adjusting to make palindrome:
abba
========================================

fae: no, stack <- f, word <- ae
ae: no, stack <- af, word <- e
e: yes, need 2 character(s)
----------------------------------------
Adjusting to make palindrome:
e, stack <- af
aea, stack <- f
faeaf
========================================

foo: no, stack <- f, word <- oo
oo: yes, need 1 character(s)
----------------------------------------
Adjusting to make palindrome:
oo, stack <- f
foof
========================================

deoxyribo: no, stack <- d, word <- eoxyribo
eoxyribo: no, stack <- ed, word <- oxyribo
oxyribo: no, stack <- oed, word <- xyribo
xyribo: no, stack <- xoed, word <- yribo
yribo: no, stack <- yxoed, word <- ribo
ribo: no, stack <- ryxoed, word <- ibo
ibo: no, stack <- iryxoed, word <- bo
bo: no, stack <- biryxoed, word <- o
o: yes, need 8 character(s)
----------------------------------------
Adjusting to make palindrome:
o, stack <- biryxoed
bob, stack <- iryxoed
ibobi, stack <- ryxoed
ribobir, stack <- yxoed
yribobiry, stack <- xoed
xyribobiryx, stack <- oed
oxyribobiryxo, stack <- ed
eoxyribobiryxoe, stack <- d
deoxyribobiryxoed
========================================

关于c# - 我如何找出最少数量的字符来创建回文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com