字符串匹配
问题描述
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
输入的第一行包含一个字符串S,由大小写英文字母组成。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例说明
在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
1<=n<=100,每个字符串的长度不超过100。
代码
package 字符串;
import java.util.Scanner;
public class 字符串匹配 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s=sc.next();
int m=sc.nextInt();//敏感选项
int n=sc.nextInt();//文字行数
String[] a=new String[n];
for(int i=0;i<n;i++){
a[i]=sc.next();
}
if(m==1){
for(int i=0;i<n;i++){
if(a[i].contains(s)){
System.out.println(a[i]);
}
}
}else{//不敏感
s=s.toLowerCase();
String[] b=new String[n];
for(int i=0;i<n;i++){
b[i]=a[i].toLowerCase();
if(b[i].contains(s))
System.out.println(a[i]);
}
}
}
}
字符串压缩
问题描述
编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(1) 如果该字符是空格,则保留该字符;
(2) 如果该字符是第一次出现或第三次出现或第六次出现,则保留该字符;
(3) 否则,删除该字符。
例如,若用户输入“occurrence”,经过压缩后,字符c的第二次出现被删除,第一和第三次出现仍保留;字符r和e的第二次出现均被删除,因此最后的结果为:“ocurenc”。
输入格式:输入只有一行,即原始字符串。
输出格式:输出只有一行,即经过压缩以后的字符串。
输入输出样例
样例输入
occurrence
样例输出
ocurenc
代码,注意空格的条件
package 字符串;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 字符串压缩 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
char[] a=s.toCharArray();
//创立一个动态数组
ArrayList<Character> list=new ArrayList<>();
Map<Character,Integer> map=new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
if(map.containsKey(a[i])==false){
map.put(a[i],0);
//System.out.println(a[i]);
}
map.put(a[i],map.get(a[i]).intValue()+1);
if(a[i]==' '){
list.add(a[i]);
}
else if(map.get(a[i])==1||map.get(a[i])==3||map.get(a[i])==6){
list.add(a[i]);
}
}
//for(int i=0;i<map.size();i++){
//System.out.println(a[i]+"="+map.get(a[i]));
//}
for(int i=0;i<list.size();i++)
System.out.print(list.get(i));
}
}
周期字串
问题描述
右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
例如:
字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
输入格式
一个最大长度为100的无空格的字符串。
输出格式
一个整数,表示输入的字符串的最小周期。
样例输入
HaHaHa
样例输出
2
样例输入
Return0
样例输出
7
分析:
首先,既然是多个相同子串组成的,则主串长度一定能够整除子串长度。
其次,for循环,判断主串中每一个字符都等于它后移子串长度个位置的字符,这才证明是相同的子串。
package 字符串;
import java.util.Scanner;
public class 周期函数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
char[] s=sc.next().toCharArray();
int ans=1;//字符串周期
while(true){
while(s.length%ans!=0)//若ans不能整除字符串长度,则递增ans
ans++;
boolean f=true;
for(int i=ans;i<s.length&&f;i+=ans)//进行n/ans重循环
for(int j=0;j<ans&&f;++j)//判断i~ans-1字符和i~i+ans-1个字符是否完全一致
if(s[j]!=s[j+i]){//字符不同
++ans;//递增ans,此周期不对
f=false;
}
if(f)//N/ans重循环字符均一致,跳出循环
break;
}
System.out.println(ans);
}
}
删除子字符串
问题描述
编写程序,输入两个字符串,从第一个字符串中删除第二个字符串,输出删除后的字符串。例如输入”abcabcd”和”bc”,则输出”aad”。用指针实现。
输入格式
输入两个字符串ch1和ch2
输出格式
输出删除ch2后的字符串ch1
样例输入
一个满足题目要求的输入范例。
例:
abcabcd
bc
样例输出
与上面的样例输入对应的输出。
例:
aad
数据规模和约定
输入数据中每一个数的范围。
输入的字符串长度小于100
代码
package 字符串;
import java.util.Scanner;
public class 删除子字符串 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s1=sc.next();
String s2=sc.next();
s1=s1.replaceAll(s2,"");
System.out.println(s1);
}
}
字符串跳步
问题描述
给定一个字符串,你需要从第start位开始每隔step位输出字符串对应位置上的字符。
输入格式
第一行一个只包含小写字母的字符串。
第二行两个非负整数start和step,意义见上。
输出格式
一行,表示对应输出。
样例输入
abcdefg
2 2
样例输出
ceg
数据规模和约定
start从0开始计数。
字符串长度不超过100000。
提示
读入上有问题,可以参照字符串进位。
尝试不要出现以下代码:for (int i = 0; i < (int) S.size(); ++i)
代码
package 字符串;
import java.util.Scanner;
public class 字符串跳步 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s=sc.next();
int start=sc.nextInt();
int step=sc.nextInt();
String ss="";
for(int i=start;i<s.length();i+=step){
ss+=s.charAt(i);
}
System.out.println(ss);
}
}
3-2字符串输入输出函数
描述
编写函数GetReal和GetString,在main函数中分别调用这两个函数。在读入一个实数和一个字符串后,将读入的结果依次用printf输出。
两次输入前要输出的提示信息分别是"please input a number:\n”和"please input a string:\n"
样例输入
9.56
hello
样例输出
please input a number:
please input a string:
9.56
hello
代码
package 字符串;
import java.util.Scanner;
public class 字符串输入输出函数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println("please input a number:");
double n=sc.nextDouble();
System.out.println("please input a string:");
String s=sc.next();
System.out.println(n);
System.out.println(s);
}
}
不同单词个数统计
问题描述
编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。
说明:(1)由于句子当中包含有空格,所以应该用gets函数来输入这个句子;(2)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;(3)不用考虑单词的大小写,假设输入的都是小写字符;(4)句子长度不超过100个字符。
输入格式:输入只有一行,即一个英文句子。
输出格式:输出只有一行,是一个整数,表示句子中不同单词的个数。
输入输出样例
样例输入
one little two little three little boys
样例输出
5
代码
package 字符串;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class 不同单词个数统计 {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] s=br.readLine().split(" ");
Map<String,Integer> map=new HashMap<String,Integer>();
for(int i=0;i<s.length;i++){
if(map.containsKey(s[i])==false){
map.put(s[i],0);
}
map.put(s[i],map.get(s[i]).intValue()+1);
}
System.out.println(map.size());
}
}
代码
package 字符串;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class 不同单词个数统计1 {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] s=br.readLine().split(" ");
Set<String> ss=new HashSet<>();
for(int i=0;i<s.length;i++)
ss.add(s[i]);
System.out.println(ss.size());
}
}
递归倒置字符数组
问题描述
完成一个递归程序,倒置字符数组。并打印实现过程
递归逻辑为:
当字符长度等于1时,直接返回
否则,调换首尾两个字符,在递归地倒置字符数组的剩下部分
输入格式
字符数组长度及该数组
输出格式
在求解过程中,打印字符数组的变化情况。
最后空一行,在程序结尾处打印倒置后该数组的各个元素。
样例输入
Sample 1
5 abcde
Sample 2
1 a
样例输出
Sample 1
ebcda
edcba
edcba
Sample 2
a
解法一
package 字符串;
import java.util.Scanner;
public class 递归倒置字符数组 {
private static char[] a;
private static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n = sc.nextInt();
String s=sc.next();
a = s.toCharArray();
if(n==1){
System.out.println();
System.out.println(s);
}
else{
for(int i=0;i<n/2;i++){
char t=a[i];
a[i]=a[n-1-i];
a[n-i-1]=t;
for(int j=0;j<n;j++)
System.out.print(a[j]);
System.out.println();
}
System.out.println();
for(int j=0;j<n;j++)
System.out.print(a[j]);
}
}
}
字符串比较
独立实现标准字符串库的strcmp函数,即字符串比较函数,从键盘输入两个字符串,按字典序比较大小,前者大于后者输出1,前者小于后者输出-1,两者相等输出0。
样例输入: apple one 样例输出:-1
样例输入: hello he样例输出:1
样例输入: hello hello样例输出:0
代码
package 字符串;
import java.util.Scanner;
public class 字符串比较 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String s1=sc.next();
String s2=sc.next();
int n=s1.compareTo(s2);
if(n>0)
n=1;
else if(n==0)
n=0;
else
n=-1;
System.out.println(n);
}
}
单词个数统计
问题描述
编写一个程序,输入一个字符串(长度不超过80),然后统计出该字符串当中包含有多少个单词。例如:字符串“this is a book”当中包含有4个单词。
输入格式:输入一个字符串,由若干个单词组成,单词之间用一个空格隔开。
输出格式:输出一个整数,即单词的个数。
输入输出样例
用户输入数据样例:
this is a book
系统输出数据如下:
4
代码
package 字符串;
import java.util.Scanner;
public class 单词个数统计 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String[] s=sc.nextLine().split(" ");
System.out.println(s.length);
}
}
6-9删除数组中的0元素
编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接收数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。
输入时首先读入数组长度,再依次读入每个元素。
将调用此函数后得到的数组和函数返回值输出。
样例输入
7
2 0 4 3 0 0 5
样例输出
2 4 3 5
4
package 字符串;
import java.util.ArrayList;
import java.util.Scanner;
public class 删除数组中的0元素 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int s[] =new int[n];
for(int i=0;i<n;i++){
s[i]=sc.nextInt();
}
ArrayList<Integer> a=new ArrayList<Integer>();
for(int i=0;i<s.length;i++){
if(s[i]!=0)
a.add(s[i]);
}
for(int i=0;i<a.size();i++)
System.out.print(a.get(i)+" ");
System.out.println();
System.out.println(a.size());
}
}