艾迪设计了一个字符串编码算法,把一个字符串S编码为另一个字符串,本题字符串中的字符均为a-z的小写字母。
他设计了一个函数FS(c),将该字符串S的某个字符c映射为另一个字符。该函数定义为:
FS(c)=chr(G(c,S))
其中G(c,S)表示字符c在字符串S中最后一次出现的位置后面不重复字符的个数。例如若S="abcaedef",则G(′a′,S)=3,因为字符'a'在S中最后一次出现的位置是3,该位置后有4个字符,但有2个'e',故不重复的字符为3个,即'e'、'd'和'f'。函数chr(i)为第i+1个小写字母,例如chr(0)=′a′, chr(1)=′b′, chr(25)=′z′。故对于S="abcaedef"有FS(′a′)=chr(G(′a′,S))=chr(3)=′d′。
艾迪的编码算法即:依次将S中的每一个字符c替换为FS(c)。例如"abc"对应的编码为"cba",因为'a'在字符串最后一次出现的位置后面有2个不重复的字符'b' 和'c',故其FS值为第3个小写字母'c';'b'在字符串最后一次出现的位置后面有1个不重复的字符'c',故其FS值为第2个小写字母'b';'c'在字符串最后一次出现的位置后面有0个字符,故其FS值为第1个小写字母'a'。同理,"aacc"的编码为"bbaa","cac" 的编码为"aba"。
现给定一个字符串,请基于艾迪的算法编写程序,输出其编码后的字符串。
输入格式:
输入为一个字符串S。字符串长度不超过105。字符串中的字符为a-z的小写字母。
输出格式:
输出一个字符串,表示编码后的字符串。
输入样例1:
aca
输出样例1:
aba
怎么样用C语言写这个程序
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 快乐鹦鹉 2022-10-30 09:29关注
挺有意思,其实主要是写G(c,s)函数,可以从字符串右侧开始统计字符个数,定义一个长度为26的整型数组,初始化为0。,遇到'a',则第0个元素值设置为1,最后数一下26个元素中有多少个1,或者累加结果即可。
#include <stdio.h> #include <string.h> int G(char c,char *S) { int a[26] = {0},num=0; int len = strlen(S); for(int i=len-1;i>=0;i--) { if(S[i] != c) { if(a[S[i]-'a'] == 0) { num++; a[S[i]-'a'] = 1; } } else break; } return num; } char FS(char c,char *S) { return 'a' + G(c,S); } int main() { char a[106] = {0}; gets(a); int i=0; while(a[i] != '\0') { a[i] = FS(a[i],a); i++; } printf("%s\n",a); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
- ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
- ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
- ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
- ¥20 腾讯企业邮箱邮件可以恢复么
- ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
- ¥15 错误 LNK2001 无法解析的外部符号
- ¥50 安装pyaudiokits失败
- ¥15 计组这些题应该咋做呀
- ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?