我是否可以获得具有两个参数的递归Prolog谓词,称为reverse,它返回列表的反转:
示例查询和预期结果:
?- reverse([a,b,c], L). L = [c,b,a].
两个参数的递归Prolog谓词,palindrome
如果给定列表是回文,则返回true.
具有预期结果的示例查询:
?- palindrome([a,b,c]). false. ?- palindrome([b,a,c,a,b]). true.
给定一个长度为N的字符串[AZ],如何确定单个字符的最长回文?
我将用一个例子来说明这一点:
给定字符串:JOHNOLSON
在分析字符串时,我们发现我们有一个带有字符的回文O
使得字符串看起来像.它的回文长度基本上看起来像7 .另外,请注意有一个回文,但它只有6个长度.J
O
HN
O
LS
O
N
O
O
--
O
--
O
N
另一个例子,给定字符串:ABCJOHNOLSON
给出与上面相同的结果,其中O
长度为7 的回文看起来像.O
--
O
--
O
但是,对于给定的字符串ABCJOHNOLSONDA
,最长的单个字符回文长度为14,字符A
看起来像.A
------------
A
其他简单的例子包括:
ABA
- > (长度3)A
-
A
ABAXYZ
- > (长度3)A
-
A
ABAXYZA
- > (长度5),而不是长度7因为不是信件的回文.A
---
A
A
-
A
---
A
A
特别注意最后一个例子,因为它说明了问题的一个微妙的细微差别.
我们的教授要求我们通过使用堆栈检查一个单词是否是回文.每次我运行它都会出错:Unhandled Exception. Access violation
我做错了什么?我该如何改进我的代码?我的代码如下:
typedef struct stack{
char name;
struct stack * next;
}Stack;
void push(Stack**head, char value);
char pop(Stack**head);
int main(){
char word[11];
int i=0;
int lenght = 0;
Stack*head = NULL;
printf("Please type the word: ");
scanf("%s", word);
lenght = strlen(word);
while(word[i]!='\0'){
push(&head, word[i]);
i++;
}
i = 0;
while(pop(&head)==word[i]){
i++;
}
if(i==lenght) printf("The word is a palindrome");
else printf("The word is not a palindrome");
}
Run Code Online (Sandbox Code Playgroud) 在http://projecteuler.net/的问题4中,它说:
回文数字两种方式相同.由两个2位数字的乘积制成的最大回文是9009 = 91*99.
找到由两个3位数字的乘积制成的最大回文.
我这里有这个代码
def isPalindrome(num):
return str(num) == str(num)[::-1]
def largest(bot, top):
for x in range(top, bot, -1):
for y in range(top,bot, -1):
if isPalindrome(x*y):
return x*y
print largest(100,999)
Run Code Online (Sandbox Code Playgroud)
它应该找到最大的回文,它吐出580085
我认为是正确的,但项目欧拉不这么认为,我在这里有什么不对吗?
当我尊敬for循环时,我没有想到它,我删除了检查最大,愚蠢的我的东西.继承人的工作代码
def isPalindrome(num):
return str(num) == str(num)[::-1]
def largest(bot, top):
z = 0
for x in range(top, bot, -1):
for y in range(top,bot, -1):
if isPalindrome(x*y):
if x*y > z:
z = x*y
return z
print largest(100,999)
Run Code Online (Sandbox Code Playgroud)
吐出906609
问题:
给定任何字符串,添加尽可能少的字符,使其成为线性时间的回文.
我只能想出一个O(N 2)解决方案.
有人可以用O(N)解决方案帮助我吗?
我正在为回文求解器编写一系列测试.我在希伯来语中遇到了有趣的回文:
טעםלפתתפלמעט
这是一个回文,但字母Mem有一个常规形式(מ)和一个"最终形式"(ם),它如何显示为单词中的最后一个字母.但是在我的程序中没有硬编码"0x5de => 0x5dd",我无法找到一种方法来以编程方式依赖Unicode,Python或将两者视为相同的库.我尝试过的事情:
s = '??? ??? ??? ???'
s.casefold() # Python 3.4
s.lower()
s.upper()
import unicodedata
unicodedata.normalize(...) # In case this functioned like a German Eszett
Run Code Online (Sandbox Code Playgroud)
所有人都产生了相同的字符串.其他会导致这个问题的希伯来字母(如果有人稍后搜索)将是Kaf,Nun,Peh和Tsadeh.不,我不是希伯来语的母语.
参考这篇关于 leetcode 的文章,解决最长回文子串问题有一个常见的错误:
反转 S 变成 S'。找出 S 和 S' 之间的最长公共子串,它也必须是最长的回文子串。
例如:
S = “abacdfgdcaba”,S' = “abacdgfdcaba”。
S 和 S' 之间最长的公共子串是“abacd”。显然,这不是一个有效的回文。
但是下面的整改我不太明白。任何人都可以用分步程序/示例来解释它吗?谢谢!
为了纠正这个问题,每次我们找到最长公共子串候选时,我们检查子串的索引是否与反向子串的原始索引相同。
编写一个方法来测试字符串是否满足成为回文的前提条件.
例如:
Run Code Online (Sandbox Code Playgroud)Input | Output mmo | True yakak | True travel | False
我在考虑这种方法:
我错过了什么吗?
如何使此代码在30秒钟内运行,以找到最大的回文数,该回文数是具有相同数字的2个数字的乘积?
def palindrome(maxInt):
pa=[]
for x in range(maxInt,0,-1):
for y in range(maxInt,0,-1):
num=x*y
if str(num) == str(num)[::-1]:
pa.append(num)
return max(pa)
Run Code Online (Sandbox Code Playgroud)
maxInt
是具有指定数字的最大数字。例如,如果您想要的回文数是2个3位数的倍数,则您maxInt
将为999。如果您想要的最大回文数是2个4位数的倍数,maxInt
则将为9999。
如果为maxInt = 9
,则应输出9。
如果为maxInt = 99
,则应输出9009。
因此,如果maxInt = 999
,则程序应输出906609。
如何maxInt=9999
在30秒内返回99000099