【字符串】PTA试题——英文单词排序 (25分)

题干如下:
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple #

输出样例:

red blue green yellow purple

.
.
.
本题需要解决以下几个问题:
**①如何一直输入字符串直到输入#为止:**使用死循环while(1),后满足一定条件便跳出循环(break语句)的方法。此题的条件显然是if(str[i][0]==’#’)。
**②如何对字符串进行排序:**对于初学者来说,首先学习的排序是“冒泡排序”,那如何对字符串进行基于长度的“冒泡排序”呢?这里,我们需要使用strlen函数和strcpy函数:(这两个函数均在头文件<string.h>中)
(1)strlen函数:统计字符串的长度。统计空格,不统计末位’\0’。
(2)strcpy函数:即复制函数。strcpy(a,b)的作用可以简单理解为将b中的字符串复制到a中(注意:b字符串的末位’\0’也会被复制,也就是说a完全变成了b)。
由于是对字符数组的复制,函数需要传递指针,则括号内只需要写数组名(首元素地址)就可以了。

**以前我们学过数字大小的冒泡排序,其中交换两数的部分通过temp暂存变量配合来实现。现在对字符串进行交换也是如此。
(temp是另外创建的一维字符数组)

if (strlen(str[k-1])>strlen(str[k]))
{
strcpy(temp,str[k]);
strcpy(str[k],str[k-1]);
strcpy(str[k-1],temp);
}

解决了上述问题,我们就可以写程序了:

#include<stdio.h>
#include<string.h>

int main(void)
{
  char str[20][11];
  int i=0;
  
  while (1)
  {
      scanf("%s",str[i]);
      if (str[i][0]=='#')
        break;
      i++;                //i同时也记录了有几个单词
  }

  int len=i;       //用len记录i,增加程序的可读性
  int j,k;
  char temp[11];
  
  for (j=0; j<=len-1; j++)     //对字符串进行冒泡排序
  {
    for (k=0; k<len-j; k++)
    {
        if (strlen(str[k-1])>strlen(str[k]))
        {
            strcpy(temp,str[k]);
            strcpy(str[k],str[k-1]);
            strcpy(str[k-1],temp);
        }
    }
  }

  for (j=0; j<=len-1; j++)
  {
      printf("%s ",str[j]);
  }
  return 0;
}

  • 35
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Levenshtein Distance算法是一种常见的字符串相似度算法,也被称为编辑距离算法。其主要思想是通过计算两个字符串之间的编辑距离来确定它们的相似程度。 编辑距离指的是将一个字符串转换成另一个字符串所需的最少操作次数,其中每次操作可以是插入、删除或替换一个字符。例如,将字符串“kitten”转换成字符串“sitting”需要进行3次操作,即将“k”替换为“s”,将“e”替换为“i”,将“n”替换为“g”。 Levenshtein Distance算法的实现一般使用动态规划的方法,通过填充一个二维矩阵来计算两个字符串之间的编辑距离。具体实现过程可以参考以下伪代码: ``` function LevenshteinDistance(s1, s2): m = length(s1) n = length(s2) d = new matrix(m+1, n+1) for i from 0 to m: d[i, 0] = i for j from 0 to n: d[0, j] = j for j from 1 to n: for i from 1 to m: if s1[i] == s2[j]: cost = 0 else: cost = 1 d[i, j] = min(d[i-1, j]+1, d[i, j-1]+1, d[i-1, j-1]+cost) return d[m, n] ``` 在以上代码中,变量s1和s2别表示两个待比较的字符串,m和n别表示它们的长度,矩阵d用于存储编辑距离的计算结果。首先,将矩阵d的第一行和第一列别初始化为0到n和0到m的整数。然后,对于每个(i, j)位置,如果s1[i]等于s2[j],则将cost设为0,否则设为1。最后,根据递推公式d[i, j] = min(d[i-1, j]+1, d[i, j-1]+1, d[i-1, j-1]+cost)来填充矩阵d,并返回d[m, n]作为编辑距离的结果。 Levenshtein Distance算法的时间复杂度为O(m*n),其中m和n别为两个字符串的长度。在实际应用中,该算法可用于拼写检查、数据去重等场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值