pat 1077. Kuchiguse (字符串水题)

本文介绍了一个使用C++实现的简单字符串匹配算法。该算法通过比较一组字符串来找出它们共有的最长后缀,并输出该后缀。代码首先读取字符串的数量,然后逐个读取这些字符串,并确定所有字符串中最短的长度作为比较的基础。之后,从字符串的末尾开始向前逐字符进行比较,直到发现不匹配的字符或检查完最短字符串的所有字符。

送分题一道


#include<string>
#include<iostream>
using namespace std;
string arr[105];
int main()
{
	int i,j,n,len,l;
	string s;
	scanf("%d",&n);
	getchar();
	int min=256;
    for(i=0;i<n;i++)
	{
		getline(cin,arr[i]);
		
		if(arr[i].size()<min)
			min=arr[i].size();
	}
	int bl=0;
	for(j=0;j<min;j++)
	{
		int sz=arr[0].size()-1;
		char x=arr[0][sz-j];
		for(i=1;i<n;i++)
		{
			if(arr[i][arr[i].size()-1-j]!=x)
			{  
				bl=1;
				break;
			}
		}
		if(bl)
			break;
	}
	if(j==0)
		printf("nai\n");
	else
	{
		j=arr[0].size()-j;
		cout<<arr[0].substr(j)<<endl;
	}
	return 0;
}


### 字符串算法及相关练习 字符串作为计算机科学中最基础的数据结构之一,其相关算法在实际应用中常广泛。以下是几个常见的字符串算法及其对应的练习: #### 1. **无重复字符的最长子串** 该问的目标是从输入字符串中找到不包含重复字符的最长子串长度。可以通过滑动窗口技术实现此功能。 ```python def length_of_longest_substring(s: str) -> int: char_set = set() l = 0 res = 0 for r in range(len(s)): while s[r] in char_set: char_set.remove(s[l]) l += 1 char_set.add(s[r]) res = max(res, r - l + 1) return res ``` 上述方法的时间复杂度为 O(N),空间复杂度同样为 O(N)[^4]。 --- #### 2. **最长回文子串** 目标是在给定字符串中找出最长的回文子串。可以采用动态规划或中心扩展法解决这一问。 ```python def longest_palindrome(s: str) -> str: if not s or len(s) < 1: return "" start, end = 0, 0 def expand_around_center(left, right): while left >= 0 and right < len(s) and s[left] == s[right]: left -= 1 right += 1 return right - left - 1 for i in range(len(s)): len1 = expand_around_center(i, i) len2 = expand_around_center(i, i + 1) curr_len = max(len1, len2) if curr_len > end - start: start = i - (curr_len - 1) // 2 end = i + curr_len // 2 return s[start:end+1] ``` 这种方法通过枚举每个可能的中心来计算最大回文半径。 --- #### 3. **反转字符串中的单词** 对于一个字符串 `s`,将其内部的单词顺序翻转并去除多余空格是一个经典问。 ```python def reverse_words(s: str) -> str: words = s.strip().split()[::-1] return ' '.join(words) print(reverse_words("Python Programming")) # 输出:"Programming Python" ``` 这里利用了内置函数 split join 来处理空白字符以及拼接操作[^2]。 --- #### 4. **字符串的循环左移** 将字符串按照指定步数向左移动若干位也是常见考察点之一。 ```cpp class Solution { public: string rotateString(string s, int n){ if(n <= 0 || s.empty()) return s; n %= s.length(); std::rotate(s.begin(), s.begin()+n, s.end()); return s; } }; ``` 这段 C++ 实现展示了如何优雅地完成旋转动作[^5]。 --- #### 5. **KMP模式匹配算法** Knuth-Morris-Pratt(KMP) 是一种高效的字符串查找算法,能够在线性时间内定位子串的位置。 ```java public static void computeLPSArray(String pat, int M, int[] lps){ int len = 0; lps[0]=0; int i=1; while(i<M){ if(pat.charAt(i)==pat.charAt(len)){ len++; lps[i]=len; i++; } else{ if(len!=0){ len=lps[len-1]; } else{ lps[i]=0; i++; } } } } ``` 以上 Java 版本实现了 KMP 的核心部分——构建 LPS 数组的过程[^1]。 --- ### 总结 这些例子涵盖了从简单到复杂的多种字符串处理技巧,适合用来准备数据结构与算法方面的面试。每道目都经过精心挑选以覆盖不同难度级别技术要点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值