在我的赋值中,函数接收一个单词字符串并返回一个带有连字符的字符串,由以下规则定义:
如果发现元音-辅音-辅音-元音模式,则在两个辅音之间使用连字符。字母"a","e",‘我’,‘o’,‘u’,和‘y’是元音;其他字符均为辅音
如果发现元音-辅音-元音模式,则在辅音之前使用连字符,除非第二个元音是"e"并且出现在单词的末尾。
以下字符序列不能被连字符分割:" qu ", " tr ", " br ", " str ", " st ", " sl ", " bl ", " cr ", " ph ", " ch "。对于规则1和规则2来说,每一个都是单个辅音。
对于规则#3,我想知道如何将字符序列读取为单个辅音。
我的特殊情况代码是:
bool isSpecialCharSequence(const char* input, int index)
{
if (input[index + 1] == 'r' || input[index + 1] == 'R')
{
if (input[index] == 't' || input[index] == 'b' || input[index] == 'c' || input[index] == 'T' || input[index] == 'B' || input[index] == 'C')
{
return false;
}
return true;
}
if (input[index] == 's' || input[index] == 'S')
{
if (input[index + 1] == 't' || input[index] == 'l' || input[index] == 'T' || input[index] == 'L')
{
return false;
}
return true;
}
if (input[index] == 'q' || input[index] == 'Q')
{
if (input[index + 1] == 'u' || input[index + 1] == 'U')
{
return false;
}
return true;
}
if (input[index + 1] == 'h' || input[index + 1] == 'H')
{
if (input[index] == 'c' || input[index] == 'p' || input[index] == 'C' || input[index] == 'P')
{
return false;
}
return true;
}
}
现在,它适用于所有字符,除了将这些字符读取为单个辅音而不是2个。
你不需要把它们当作一个辅音来读。你只需要这样解释它。
任务如下:
VCCV→VC-CV
VCV→V-CV,除非它是VCe并且是单词
的结尾没有划分单辅音:"曲"、"tr","品牌","力量","圣"、"sl"、"提单"、"cr"、"ph"、"ch">
解决这个问题的一个简单方法是首先以这样一种方式复制字符串,在复制中将qu、tr、br、str、st、sl、bl、cr、ph、ch替换为某个辅音,无论哪个辅音都可以。所以你有一个原始的,没有做任何改变(你以后会用到它)和一个"损坏的"。抄,你把所有奇怪的辅音都换成了"d"或者其他常量(不管是哪一个,因为从现在开始,你可以忽略规则3)。
查看副本并在适当的位置添加连字符,将连字符的索引存储在副本中。现在遍历字符,同时查看未修改的原始字符和带连字符的副本,如果看到不同之处,可以确定它是一个特殊的辅音,因此需要在副本的索引中添加1,在原始的索引中添加2(或3)。
建议使用一个常数替代的特殊辅音的长度是2和其他一些辅音长度是3,那么你将有一个简单的时间处理原始的和当你添加连字符复制到原来的基于复制。