这个问题来自UCSD的Java课程,对吗?
我认为你应该为这个问题提供足够的信息,以免让想要提供帮助的人感到困惑。在这里,我有自己的解决方案,它已经通过本地程序的测试用例以及来自 UCSD 的 OJ 进行了测试。
您在这个问题中错过了有关音节定义的一些重要信息。其实我觉得这个问题的关键是你应该如何处理e
.例如,假设有一个组合te
。如果你把te
在单词中间,当然应该算作一个音节;但是,如果它位于单词的末尾,则e
应该被认为是silent e
在英语中,因此不应将其视为音节。
就是这样。我想用一些伪代码写下我的想法:
if(last character is e) {
if(it is silent e at the end of this word) {
remove the silent e;
count the rest part as regular;
} else {
count++;
} else {
count it as regular;
}
}
你可能会发现我不仅使用正则表达式来处理这个问题。其实我也想过:这道题真的可以只用正则表达式来完成吗?我的回答是:不,我不这么认为。至少现在,以加州大学圣地亚哥分校给我们的知识,做到这一点太困难了。正则表达式是一个强大的工具,它可以非常快速地映射所需的字符。然而正则表达式缺少一些功能。采取te
再次举个例子,正则表达式在面对这样的词时不会三思而后行teate
(我编造这个词只是为了举例)。如果我们的正则表达式模式算第一个te
作为音节,那为什么最后一个te
not?
与此同时,UCSD实际上在作业纸上谈到了这一点:
如果您发现自己在做心理体操,想出一个正则表达式来直接计算音节,这通常表明有一个更简单的解决方案(提示:考虑字符循环 - 请参阅下面的下一个提示)。仅仅因为一段代码(例如正则表达式)更短并不意味着它总是更好。
这里的提示是,你应该将这个问题与一些循环一起考虑,并与正则表达式结合起来。
好吧,我现在终于应该展示我的代码了:
protected int countSyllables(String word)
{
// TODO: Implement this method so that you can call it from the
// getNumSyllables method in BasicDocument (module 1) and
// EfficientDocument (module 2).
int count = 0;
word = word.toLowerCase();
if (word.charAt(word.length()-1) == 'e') {
if (silente(word)){
String newword = word.substring(0, word.length()-1);
count = count + countit(newword);
} else {
count++;
}
} else {
count = count + countit(word);
}
return count;
}
private int countit(String word) {
int count = 0;
Pattern splitter = Pattern.compile("[^aeiouy]*[aeiouy]+");
Matcher m = splitter.matcher(word);
while (m.find()) {
count++;
}
return count;
}
private boolean silente(String word) {
word = word.substring(0, word.length()-1);
Pattern yup = Pattern.compile("[aeiouy]");
Matcher m = yup.matcher(word);
if (m.find()) {
return true;
} else
return false;
}
你可能会发现除了给定的方法之外countSyllables
,我还创建了两个额外的方法countit
and silente
. countit
用于计算单词内的音节,silente
正在试图弄清楚这个词是否以无声结尾e
。还应该注意的是,not silent e
。例如,the
应该考虑not silent e
, while ate
被认为silent e
.
这是我的代码已经通过测试的状态,来自本地测试用例和 UCSD 的 OJ:
从 ON 的测试结果来看:
P.S: 直接使用像 [^aeiouy] 这样的东西应该没问题,因为在我们调用这个方法之前这个词已经被解析了。还需要更改为小写,这将节省处理大写的大量工作。我们想要的只是音节数。
谈论数字,一种优雅的方式是定义count
因为是静态的,所以私有方法可以直接使用count++
里面。但现在好了。
如果您还是不明白这个问题的方法,请随时联系我:)