python和c++之 练习题6 字符串变换,语料字典,特殊单词

本文是接着上一篇(1条消息) c语言之 练习题3 大贤者福尔(乘积),镂空等腰三角形,目录列表_水w的博客-CSDN博客

目录

字符串变换

代码1:python

代码2:c++

执行结果:

语料字典

代码1:c++

代码2:python

特殊单词

代码1:python

代码2:python

代码3:c++


字符串变换

大贤者福尔最近开始研究字符串的变换问题,他提出了一个变换规则,使得一个字符串经过一系列变换之后,生成另一个字符串,他把这两个字符串称作等价串

具体变换规则为:初始状态下有一个长度为NN的字符串A,另有B、C两个空串。变换的规则是:从A串的第一个字符开始,依次取出串中的每个字符,可以选择将取出的字符直接放入字符串B或C的尾部。若字符串A或B中还有字符,可以继续从A中按顺序取出单个字符放入串B或C的尾部,也可以选择从串B的尾部取出单个字符并放入串C的尾部,最终使得串A、B为空串,串C为最终的变换结果,作为串A的等价串。

  • 输入:输入数据有若干组,每组包含两个长度均不超过N (1 \le N \le 100 )N(1≤N≤100)的字符串,字符串由大小写字母、数字和其他可打印字符组成。
  • 输出:对每组输入数据,在单独的行中输出如Case x: ans的结果信息,其中ans为对应的结果。若给定的两个串为等价串,ans为Yes,否则为No
  • 示例输入:
ABCDE
ABCDE
ABCDE
CABDE
A
ABCDE
  • 示例输出:
Case 1: Yes
Case 2: No
Case 3: No

代码1:python

if __name__ == '__main__':
    import sys
    lines = list(map(str.strip, sys.stdin.readlines()))
    lines = [[lines[i], lines[i + 1]] for i in range(0, len(lines), 2)]
    for id, line in enumerate(lines):
        str_1, str_2 = line
        A, B, C = [x for x in str_1], [], [x for x in str_2]
        while A:
            B.append(A[0])
            A = A[1:]
            while B and B[-1] == C[0]:
                B = B[:-1]
                C = C[1:]
        if C:
            print(f'Case {id + 1}: No')
        else:
            print(f'Case {id + 1}: Yes')

代码2:c++

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
string s1,s2;
void solve()
{
    queue<char> q1, q2;
    stack<char> s;
    for (int i = 0; i < int(s1.length()); i++){
        q1.push(s1[i]);
    }
    for (int i = 0; i < int(s2.length()); i++){
        q2.push(s2[i]);
    }
    while (!q1.empty()){
        while (s.empty() || s.top() != q2.front()){
            if (q1.empty())
                break;
            s.push(q1.front());
            q1.pop();
        }
        while (!s.empty() && s.top() == q2.front()){
            s.pop();
            q2.pop();
        }
    }
    if (q2.empty()){
        cout << "Yes" << endl;
    }
    else
        cout << "No" << endl;
}
int main(){
    int cnt = 1;
    while (cin>>s1>>s2){
        cout<<"Case "<<(cnt++)<<": ";
        solve();
    }
    return 0;
}

执行结果:

语料字典

小A正在开展面向领域的自然语言处理研究,这项工作的第一步就是建立语料字典,即从给定的语料库中,分割并提取相应的词汇,并将词汇按某种顺序排列,从而发现该领域中的标识性词汇,为进一步研究奠定基础。

这项工作费时费力且比较枯燥,需要去掉语句中的标点符号、连字符等,还有去掉所有格,并按空白进行单词分割,实在是太麻烦了,他希望你能够编写一个计算机程序帮他解决这个问题。

  • 输入:输入数据不超过500行,每行最多包括200个ASCII码大小写子母和标点符号,单词之间以空格分隔。
  • 输出:输出小写形式的所有单词。单词不区分大小写,由26个英文字母构成。请按单词出现次数从高到低及字典序依次输出所有的单词,要求每个单词在单独的行中输出。
  • 示例输入:
Peter's Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
So they went home.
  • 示例输出:
disneyland
in
the
they
to
a
adventures
blondes
came
fork
going
home
left
peter
read
road
sign
so
two
went
were
when

代码1:c++

#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
deque<string> deq;
stack<string> sta;
set<string> st;
string s, op;
bool fun () { //是否存在s的熟人,如果存在返会true
    while (!sta.empty()) sta.pop();
    if (st.count(s) == 0) return false;
    int size = deq.size();
    bool flag = false;
    while (size--) {
        if (st.count(deq.back()) != 0) {
            if (mp[s] == mp[deq.back()])    flag = true;
        }
        sta.push(deq.back());
        deq.pop_back();
    }
    while (!sta.empty()) {
        deq.push_back(sta.top());
        sta.pop();
    }
    return flag;
}
void init() {
    mp.clear();
    deq.clear();
    while (!sta.empty()) sta.pop();
}
int main () {
    int n, m, cnt = 1, size;
    while (cin >> n) {
        if (n != 0) {
            cout << "Case #" << cnt << ":" << endl;
            cnt++;
        }
        init();
        for (int i = 0; i < n; i++) {
            cin >> m;
            for (int j = 0; j < m; j++) {
                cin >> s;
                mp[s] = i;
                st.insert(s);
            }
        }
        while (true) {
            cin >> op;
            if (op == "stop") break;
            if (op == "enqueue") {
                cin >> s;
                if (deq.size() == 0 || st.count(s) == 0) {
                    deq.push_back(s);
                    continue;
                }
                if (fun()) {
                    size = deq.size();
                    while (size--) {
                        if (st.count(deq.back()) != 0) {
                            if (mp[s] == mp[deq.back()]) {
                                deq.push_back(s);
                                break;
                            }
                        }
                        sta.push(deq.back());
                        deq.pop_back();
                    }
                    while (!sta.empty()) {
                        deq.push_back(sta.top());
                        sta.pop();
                    }
                } else {
                    deq.push_back(s);
                }
            }
        }
    }
}

代码2:python

import re
li = []
res = {}
while True:
    try:
        s = input().split()
        for i in range(len(s)):
            s[i] = s[i].lower()
            if "'s" in s[i]:
                s[i] = re.sub("'s", '', s[i])
            s[i] = ''.join(list(x for x in s[i] if x.isalpha()))
        li.extend(list(i for i in s if i.isalpha()))
    except EOFError:
        break
for i in sorted(li):
    res[i] = li.count(i)
for i in sorted(res.items(), key=lambda item: item[1], reverse=True):
    print(i[0])

特殊单词

一篇文章由有若干个单词构成,小A希望知道文章中有哪些特殊单词。所谓特殊单词是指,构成这个单词的字母经过顺序变换形成的一个新单词也出现在文章中。与原单词构成的字母对比,新单词的字母可以有大小变化。

小A希望知道文章中这样的特殊单词有哪些,您能帮他找出来吗?

  • 输入:输入数据有若干行,每行为一个字符串,由空格分隔开,单词由大小写字符及数字构成,每个单词长度不超过30个ASCII码字符。若该行字符为#,表示输入结束。
  • 输出:按不区分大小写的字典序输出所有的特殊单词,所有特殊单词按其第一次在文章中出现的形式输出,每行输出一个单词。
  • 示例输入:
a aa sd 12 aaa Bd dB
BD c a 21 A
aa aaa
#
  • 示例输出:
12
Bd
a

代码1:python

if __name__ == '__main__':
    words = []
    while True:
        line = input()
        if line == '#':
            break
        words += line.split()
    words = list(dict.fromkeys(words))
    new_words = {}
    for word in words:
        new_word = ''.join(sorted([char.lower() for char in word]))
        if new_word in new_words:
            new_words[new_word] = [new_words[new_word][0]+1, new_words[new_word][1]]
        else:
            new_words[new_word] = [1, word]
    output = [new_words[key][1] for key in new_words if new_words[key][0] > 1]
    output.sort()
    print("\n".join(output))

  

代码2:python

str2=[]
str=[]
def loca(st,list):
    site=[]
    for i in range(len(list)):
        if list[i]==st:
            site.append(i)
    return site
while True:
    str1=input().split()
    if str1[0]=='#':
        break
    str =str + str1
for i in str:
    if i not in str2:
        str2.append(i)
str1=str2.copy()
for i in range(len(str1)):
    flag1=str1[i]
    flag1 = flag1.lower()
    flag1=list(flag1)
    flag1.sort()
    flag1="".join(flag1)
    str1[i]=flag1
str3 = []
str4=[]
for i in str1:
    if i not in str3:
        str3.append(i)
for i in range(len(str3)):
    if str1.count(str3[i])>1:
        list=loca(str3[i],str1)
        for j in range(len(list)):
            if str3[i]!=str2[list[j]]:
                str4.append(str2[list[0]])
                break
str4.sort()
for j in str4:
    print(j)

代码3:c++

#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
string str1[1000], str4[1000];
string str2, str3;
map<string, string>ma;
int ans = 0;
int bns = 0;
int main() {
	cin >> str2;
	while (str2 != "#") {
		str3 = str2;
		transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
		str1[ans] += str2;
		++ans;
		sort(str2.begin(), str2.end());
		if (ma[str2] == ""){
			ma[str2] = str3;
		}
		else {
			if (ma[str2] != str3){
				str4[bns++] = ma[str2];
			}
				
		}
		cin >> str2;
	}
	
	sort(str4, str4 + bns);
	
	int y = unique(str4, str4 + bns) - str4;
	
	for (int i = 0; i < y; i++){
		cout << str4[i] << endl;
	}
		
	return 0;
}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值