洛谷[P1628]合并序列题解(c/c++)

合并序列

题目描述

N N N 个单词和字符串 T T T,按字典序输出以字符串 T T T 为前缀的所有单词。

输入格式

输入文件第一行包含一个正整数 N N N

接下来 N N N 行,每行一个单词,长度不超过 100 100 100

最后一行包含字符串 T T T

输出格式

按字典序升序输出答案。

样例 #1

样例输入 #1

6
na
no
ki
ki
ka
ku
k

样例输出 #1

ka
ki
ki
ku

提示

【数据规模】

对于 60 % 60\% 60% 的数据,满足 1 ≤ N ≤ 1000 1 \le N \le 1000 1N1000

对于 100 % 100\% 100% 的数据,满足 1 ≤ N ≤ 100000 1 \le N \le 100000 1N100000 且所有字符均为小写字母。

题解

这是一道判断字符串前缀的问题,在前缀符合的时候按字典序输出。

使用c++中的**sort()**可以很好的解决字典序排列的问题,将字符串数组,字符串数组+长度传入sort函数即可。

首先写一个判断当前字符串和判定前缀是否符合的函数issame(),传入i,i是字符串数组string s[]的第i位,即当前判断的单词下标,lens是当前这个单词的长度,会在主函数中计算,lent是判定前缀的长度,一样会在主函数中计算。

从当前单词的第一位开始判断,在不超过字符长度的情况下j++,声明一个k来记录判定前缀当前判定到第几个了,所以需要每次判断的时候都初始化为0,当单词第j位s[i][j]和前缀第k位t[k]不相等的时候直接return false标记这个单词不符合,在一位判断结束后k++,for循环结束后返回true,表示此单词符合。 我最开始写的时候只判断了第一位,循环逻辑有一些问题,还是要写下来仔细模拟判断逻辑才比较严谨。

bool issame(int i,int lens,int lent) {
	int k = 0;
	for (int j = 0; j < lens&&k<lent; j++) {
		if (s[i][j] != t[k]){ 
			return false;
		}
		k++;
	}
	return true;
}

main函数关键代码如下:先计算各字符串长度,在调用判断函数来判断当前是否符合,符合的话存入结果字符串数组res中,事先声明一个int b来记录结果数组中的位置。直接用sort函数来对结果数组进行字典序排列。

	for (int i = 0; i < n; i++) {
		lens = s[i].length();
		lent = t.length();
		flag = issame(i, lens, lent);
		if (flag == true) {
			res[b] = s[i];
			b++;
		}
	}
	sort(res, res + b);

完整代码如下:

#include <iostream>
#include<sstream>
#include<stdio.h>
#include<iomanip>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

//P1628 合并序列
int n; string s[1000005]; string t; string res[100005]; 
 bool flag; int b=0;
bool issame(int i,int lens,int lent) {
	int k = 0;
	for (int j = 0; j < lens&&k<lent; j++) {
		if (s[i][j] != t[k]){ 
			return false;
		}
		k++;
	}
	return true;
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s[i];
	}
	cin >> t;
	int lens, lent; 
	for (int i = 0; i < n; i++) {
		lens = s[i].length();
		lent = t.length();
		flag = issame(i, lens, lent);
		if (flag == true) {
			res[b] = s[i];
			b++;
		}
	}
	sort(res, res + b);

	for (int i = 0; i < b; i++) {
		cout << res[i]<<endl;
	}
}

亲测已AC!

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
过河卒是一个典型的动态规划问题。首先,我们将整个棋盘看作一个二维数组,数组的每个元素表示到达该位置的路径数目。然后,我们根据题目给出的条件,逐步更新数组中的元素,直到计算出到达目标位置的路径数目。 具体的解题思路如下: 1. 首先,我们可以将马的位置设置为0,表示无法经过该位置。 2. 然后,我们根据马的位置,更新数组中的元素。对于二维数组中的每个位置,我们根据左边和上边的位置来计算到达当前位置的路径数目。具体地,如果左边和上边的位置都可以经过,那么到达当前位置的路径数目就等于左边和上边位置的路径数目之和。如果左边或上边的位置无法经过,那么到达当前位置的路径数目就等于左边或上边位置的路径数目。 3. 最后,我们输出目标位置的路径数目。 下面是洛谷p1002过河卒题解C++代码: ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a[21][21]; int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; // 初始化数组,马的位置设置为0 for(int i=0; i<=20; i++) { for(int k=0; k<=20; k++) { a[i][k] = 1; } } a[x2][y2] = 0; // 根据马的位置更新数组中的元素 if(x2 >= 2 && y2 >= 1) a[x2-2][y2-1] = 0; if(x2 >= 1 && y2 >= 2) a[x2-1][y2-2] = 0; if(x2 <= 18 && y2 >= 1) a[x2+2][y2-1] = 0; if(x2 <= 19 && y2 >= 2) a[x2+1][y2-2] = 0; if(x2 >= 2) a[x2-2][y2+1] = 0; if(x2 >= 1) a[x2-1][y2+2] = 0; if(y2 >= 1) a[x2+2][y2-1] = 0; if(y2 >= 2) a[x2+1][y2-2] = 0; // 动态规划计算路径数目 for(int i=1; i<=20; i++) { for(int k=1; k<=20; k++) { if(a[i][k] != 0) { a[i][k] = a[i-1][k] + a[i][k-1]; } } } // 输出目标位置的路径数目 cout << a[x1][y1] << endl; return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值