Problem 27. Pangrams!
A pangram, or holoalphabetic sentence, is a sentence using every letter of the alphabet at least once.
Example:
Input s = 'The quick brown fox jumps over the lazy dogs'
Output tf = true
这个又是涉及到字符串中内容字母表进行比较的题目,之前见到过两次了,一次是去除掉句子中的元音字母,一次是去掉句子中的辅音字母,都用到了正则表达式的一个替换函数,叫做regexprep(),所以这次主动性的就想往上面去靠,未果,不过也许还是可以通过这个函数做出来的,暂时没想到,就总结一下这次学习到的新函数吧。
首先是在GitHub上面看到的一个解,其中主要用到的函数就是ismember(),用来判断数组元素是否为集数组成员,那么通过判断所要输入的字符串变量s中的元素是否为字母表中成员,就会得到一个经判断过后生成的对应下标,在去重之后,若满足pangram的条件,就会留下一个由0到26组成的数字序列,删除0(0代表非字母元素)后与1:26进行比较,或者直接判断所剩下的序列index的长度是否为26,从而得到最后的逻辑值tf,代码如下。
function tf = ispangram(s)
s = lower(s);
letters_small = 'abcdefghijklmnopqrstuvwxyz';
[x,index] = ismember(s,letters_small)
index = unique(index);%这里unique函数既可以去重又可以排序
index(index == 0) = [];
if length(index) == 26
tf = true;
else
tf = false;
end
end
通常这种看似简单的问题都确实是存在一些很简单的用法的,接下来在总结一种看到的只用一行代码就解决问题的方法,用到的函数就是ismember()和all()。刚刚介绍了ismember()的作用就是判断元素是否在集合内,那么回顾一下all()的作用其实是判断向量中的元素是否全部非零。前述方法的比较逻辑是判断s中的元素是否在字母表中,而下面这个逻辑则是判断字母表中的元素是否在s中,通过另一个角度来判断,可以直接得到一个由逻辑值0和1组成的1*26的向量,若为pangram,自然能够在s中找到字母表中所有的元素,代码如下。
function tf = ispangram(s)
tf = ismember('a':'z',lower(s));
end
在上面代码中,顺便还学到了字母表的简便表示方法,其实可以理解的,用冒号表示从前者依次到后者的序列,不过没想到字母也可以用同样的方法表示,方便了很多。