求单词个数的三种算法分析
2010-08-29陈娜,付沛
陈 娜 ,付 沛
1.武汉软件工程职业学院软件系,湖北武汉 430205
2.中冶南方(武汉)威仕软件公司,湖北武汉 430223
1)由图1圆圈处可知,当遍历字符串时,当满足条件前一个字符为空格,后一个字符不为空,就可以认定为一个单词的开始,单词个数可以加1(特殊情况需要考虑:如果字符串的首字符为空格,则计算出来的字符串的单词个数是正确的;如果首字符不为空,则字符串包含的单词的总个数需要加1,细节见图1的菱形框处)。代码如下。这种算法是找每个单词的头,也可以改变一下思维方式再派生出另外一种写法:找每个单词的尾。当满足条件前一个字符不为空,后一个字符为空,就可以认定为一个单词的结束,单词个数可以加1(特殊情况需要考虑:如果字符串的末字符为空格,则计算出来的字符串的单词个数是正确的;如果末字符不为空,则字符串包含的单词的总个数需要加1)。
图1
2)由图1可知,遍历字符串时单词个数是否正确取决于首字符,如果首字符不为空,单词个数需要加1,可以不管字符串首字符是否为空,默认给字符串开始加一个空格,引入一个变量c来保存前一个位置的字符,让它的初始值为空格,相当于默认所有的字符串的首字符都为空。这样一来遍历数组后count的值肯定是单词个数。代码如下:
3)遍历数组,如果第一个字符遇见非空格,说明这是一个单词的开头 ,count值加 1,通过语句“while(i<ch.length && ch[i]!=' ')i++;”找到下一个空格的下标i,如果遇见空格,什么事情都不做,继续查看下一个字符(特别是碰到连续的空格,语句“if(ch[i]==' ')continue;”用来跳过连续的空格,直到找到一个非空格为止)。通过执行循环遍历数组,count的值就是单词的个数。其中while语句的条件中使用短路与“&&”很有技巧,使用了短路运算符,一旦字符串的最后一个字符不是空格,执行i++后i= ch.length时条件“i<ch.length”不成立时直接将第二个条件“ch[i]!=' '”短路,否则如果使用“&”不短路第二个条件,会产生数组越界异常。代码如下:
[1]王路群主编.Java高级程序设计中国水利水电出版社,2006,8.
[2]王路群主编.数据结构中国水利水电出版社,2007,2.