Javascript 生成字符串的所有协和音
我想生成给定字符串的所有协和音 协和是通过重复来识别的一种文体文学手段 指相邻单词中相同或相似的辅音,其元音 声音是不同的。() A是字母表中表示辅音的字母。 下表吸收了英语辅音组,采用以下便利条件使事情变得简单(ISIC):Javascript 生成字符串的所有协和音,javascript,algorithm,Javascript,Algorithm,我想生成给定字符串的所有协和音 协和是通过重复来识别的一种文体文学手段 指相邻单词中相同或相似的辅音,其元音 声音是不同的。() A是字母表中表示辅音的字母。 下表吸收了英语辅音组,采用以下便利条件使事情变得简单(ISIC): 它忽略了图(“sh”、“ch”、“th”等) 它忽略元音 它忽略了“h”、“y”、“w”、“x” 它假设一个给定的字母只能是一个辅音组的成员。因此,“c”是(随机)与“s”和“z”放在一起的,“g”与“j”放在一起的 我们还假设一个符合案例2和3的输入是允许的,应该忽略。
var consonances = ["gedi", "jeti", "geti"]
注意,“e”和“i”——誓言(案例2)——可以作为输入
其他一些例子:
"btb" --> ["ptb", "pdb", "pdp", "bdb", "bdp", "btp", "ptp"]
"star" --> ["ctar", "ztar", "sdar", "cdar", "zdar"]
无效输入:
“show”、“chair”、“high”、“the”
“当然”、“猫”、“好”
我建议在地图中组织相关辅音:
var consonants = {
"b": "p",
"p": "b",
"c": "sz",
"s": "cz",
"z": "cs",
"d": "t",
"t": "d",
"f": "v",
"v": "f",
"g": "j",
"j": "g",
"k": "q",
"q": "k",
];
现在可以逐字符迭代字符串。如果你在地图中遇到一个字符,考虑在POS中插入的映射字符串中的每个字符的改变的单词(除了你所做的不变的递归)。伪代码:
function generate(word, pos) {
if (pos == word.length) {
console.log(word);
return;
}
generate(word, pos + 1);
mapped = consonants[word.charAt(pos)];
if (mapped != null) {
var prefix = word.substring(0, pos);
var suffix = word.substring(pos + 2);
for (var i = 0; i < mapped.length; i++) {
var changed = prefix + mapped.charAt(i) + suffix;
geneate(changed, pos + 1);
}
}
}
函数生成(word、pos){
if(pos==字长){
console.log(word);
返回;
}
生成(word,pos+1);
映射=辅音[word.charAt(pos)];
如果(映射!=null){
变量前缀=字。子字符串(0,位置);
变量后缀=单词子字符串(位置+2);
对于(变量i=0;i
我可以给你一个简单的算法,如何在python中使用递归算法来实现
import itertools
consonants = [['b', 'p'],
['c', 's', 'z'],
['d', 't'],
['f', 'v'],
['g', 'j'],
['k', 'q']]
# Create a map to indicate which group can the letter be found in
sound = {} # These are actually index of groups for letters
for i,a_group in enumerate(consonants):
for letter in a_group:
sound[letter] = i # b, p have the sound 0, c,s,z have sound 1 etc
def getConsonantsRec(c, options):
if len(c) > 0:
if c[0] in sound:
options.append(consonants[sound[c[0]]]) # Add all letters as the option at this place
else:
options.append([c[0]]) #Only this letter at this place
getConsonantsRec(c[1:],options) #Make string shorter each call
return
def getConsonants(c):
options = []
getConsonantsRec(c,options)
return [x for x in itertools.product(*options)] #Generate the combinations from the options at each place
allConsonants = getConsonants('star')
print(allConsonants)
输出:
[('c', 'd', 'a', 'r'), ('c', 't', 'a', 'r'), ('s', 'd', 'a', 'r'), ('s', 't', 'a', 'r'), ('z', 'd', 'a', 'r'), ('z', 't', 'a', 'r')]
现在,您可以通过添加对对角线、元音等的检查来进一步增强这一点。其他解决方案帮助我省钱:这是一个简单的笛卡尔积问题。拿着适合你需要的东西,你就完成了。例如:
console.log(…getConsonances('stars').map(con=>con.join(“”));
函数getConsonances(s){
让辅音=[];
设idx=0;
s、 拆分('').forEach((c)=>{
const curconsonates=getconsonates(c);
if(辅音长度){
辅音组合。按(辅音组合);
idx++;
}否则{
让notConsonant=[combconsonats[idx]?combconsonats[idx]:[],c]。连接(“”);
组合辅音。拼接(idx,1,[非辅音]);
}
});
返回cartesianProduct(组合辅音);
}
辅音函数(c){
常量辅音=[
['b','p'],
[c',s',z'],
['d','t'],
['f','v'],
['g','j'],
[k','q']
];
设辅音=[];
辅音。每((组)=>{
if(包括(c)类){
辅音组;
};
return!curconsonates.length;
});
返回辅音;
}
功能卡特尔产品(arr){
返回arr.reduce((a,b)=>
a、 map(x=>b.map(y=>x.concat(y)))
.reduce((a,b)=>a.concat(b),[],[]);
}
import itertools
consonants = [['b', 'p'],
['c', 's', 'z'],
['d', 't'],
['f', 'v'],
['g', 'j'],
['k', 'q']]
# Create a map to indicate which group can the letter be found in
sound = {} # These are actually index of groups for letters
for i,a_group in enumerate(consonants):
for letter in a_group:
sound[letter] = i # b, p have the sound 0, c,s,z have sound 1 etc
def getConsonantsRec(c, options):
if len(c) > 0:
if c[0] in sound:
options.append(consonants[sound[c[0]]]) # Add all letters as the option at this place
else:
options.append([c[0]]) #Only this letter at this place
getConsonantsRec(c[1:],options) #Make string shorter each call
return
def getConsonants(c):
options = []
getConsonantsRec(c,options)
return [x for x in itertools.product(*options)] #Generate the combinations from the options at each place
allConsonants = getConsonants('star')
print(allConsonants)
[('c', 'd', 'a', 'r'), ('c', 't', 'a', 'r'), ('s', 'd', 'a', 'r'), ('s', 't', 'a', 'r'), ('z', 'd', 'a', 'r'), ('z', 't', 'a', 'r')]