九十二.字符串算法问题(一)

题一:判断字符串中有无重复字符
实现一个算法,确定一个字符串的所有字符是否全都不同。

import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean checkdifferent(String s){
    
    
		int[] flag = new int[1000];
		for(int i = 0; i<s.length(); i++){
    
    
			int c = (int)(s.charAt(i));
			if(flag[c]>0)
				return false;
			else
				flag[c]++;
		}
		return true;
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s = in.next();
		boolean res = checkdifferent(s);
		if(res == false)
			System.out.println("有重复");
		else
			System.out.println("无重复");
	}
}

在这里插入图片描述

题二:翻转字符串
给定一个算法,翻转一个给定的字符串

import java.util.Scanner;

public class LianXi {
    
    
	
	public static String ReverseString(String s){
    
    
		int N = s.length();
		char[] t = new char[N];
		for(int i = 0; i<N; i++){
    
    
			t[i] = s.charAt(N-1-i);
		}
		return new String(t);
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s = in.next();
		String res = ReverseString(s);
		System.out.println(res);
	}
}

在这里插入图片描述
题三:变形词问题
变形词:两个串有相同的字符及数量组成
给定两个字符串,请编写程序,确定一个字符串的字符重新排序后,能否变成另一个字符串
这里规定大小写为不同字符,且考虑字符串中的空格。

import java.util.Arrays;
import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean checksam(String A, String B){
    
    
		int lenA = A.length();
		int lenB = B.length();
		if(lenA != lenB){
    
    
			return false;
		}
		char[] arrA = A.toCharArray();
		char[] arrB = B.toCharArray();
		Arrays.sort(arrA);
		Arrays.sort(arrB);
		return Arrays.equals(arrA,arrB);
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String A = in.next();
		String B = in.next();
		boolean res = checksam(A, B);
		if(res == false)
			System.out.println("不是变形词");
		else
			System.out.println("是变形词");
	}
}

在这里插入图片描述
在这里插入图片描述
题四: 替换字符串中的空格
请编写一个方法,将字符中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。
给定个一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。

解法一:

public class LianXi {
    
    
	
	public static String replaceString(String iniString, int length){
    
    
		return iniString.replaceAll("\\s", "%20");
	}
	
	public static void main(String[] args){
    
    
		System.out.println(replaceString("Mr John Smith",13));
	}
}

解法二:

public class LianXi {
    
    
	
	public static String replaceString(char[] iniString, int length){
    
    
		int count = length;
		for(int i = 0; i<length; i++){
    
    
			if(iniString[i] == ' ')
				count += 2;
		}
		int p1 = length - 1;
		int p2 = count - 1;
	    while(p1 > 0){
    
    
	    	if(iniString[p1] == ' '){
    
    
	    		iniString[p2--] = '0';
	    		iniString[p2--] = '2';
	    		iniString[p2--] = '%';
	    	}
	    	else{
    
    
	    		iniString[p2--] = iniString[p1];
	    	}
	    	p1--;
	    }
	    return new String(iniString,0,count);
	}
	
	public static void main(String[] args){
    
    
		System.out.println(replaceString("Mr John Smith000000".toCharArray(),13));
	}
}

在这里插入图片描述
题五:压缩字符串
利用字符串重复出现的次数,编写一个方法,实现基本的字符串压缩功能。
比如,字符串“aabcccccaaa” 经压缩会变成a2b1c5a3。
若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString 为特压缩的串(长度小于等于10000),
保证串内字符均由大小写英文字母组成,返回一个string ,为所求的压缩后或为变化的串
测试样例
“aabcccccaaa”
返回:“a2b1c5a3”

import java.util.Scanner;

public class LianXi {
    
    
	
	public static String zipString(String s){
    
    
		int count = 0;
		int last = 0;
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i<s.length(); i++){
    
    
			char charat = s.charAt(i);
			if(sb.length() == 0){
    
    
				sb.append(charat);
				count++;
			}
			else{
    
    
				if(last == charat){
    
      //和上一个字符相同
					count++;
				}
				else{
    
                   //和上一个字符不同
					sb.append(count).append(charat);
					count = 1;      //重置为1
				}
			}
			last = charat;
		}	
		//考虑最后一个字符的重复次数
		if(count >=1){
    
    
			sb.append(count);
		}
		//比较新字符串和原字符串
		if(sb.length()>=s.length()){
    
    
			return s;
		}
		return sb.toString();
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s = in.next();
		String res = zipString(s);
		System.out.println(res);
	}
}

在这里插入图片描述
题六:判断两字符串的字符集是否相同

解法一:

import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean checkSam(String s1, String s2){
    
    
		int[] help = new int[1000];
		for(int i = 0; i<s1.length(); i++){
    
    
			char c = s1.charAt(i);
			if(help[c]==0){
    
    
				help[c] = 1;
			}
		}
		for(int j = 0; j<s2.length(); j++){
    
    
			char c = s2.charAt(j);
			if(help[c]==0){
    
    
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s1 = in.next();
		String s2 = in.next();
		boolean res = checkSam(s1, s2);
		if(res==false)
			System.out.println("不相同");
		else
			System.out.println("相同");
	}
}

解法二:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean checkSam(String s1, String s2){
    
    
		Map<Character,Integer> map = new HashMap<>();
		for(int i = 0; i<s1.length(); i++){
    
    
			char c = s1.charAt(i);
			if(map.get(c) == null){
    
    
				map.put(c, 1);
			}
		}
		for(int j = 0; j<s2.length(); j++){
    
    
			char c = s2.charAt(j);
			if(map.get(c) == null){
    
    
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s1 = in.next();
		String s2 = in.next();
		boolean res = checkSam(s1, s2);
		if(res==false)
			System.out.println("不相同");
		else
			System.out.println("相同");
	}
}

在这里插入图片描述
在这里插入图片描述
题七: 字符串移位包含的问题
给定两个字符串s1和s2,要求判定s2是否能够通过s1作循环移位得到的字符串包含。例如,给定s1 = AABCD和 s2 = CDAA,返回true;给定s1 = ABCD和 s2 = ACBD,返回false。

import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean checkSam(String A, String B){
    
    
		StringBuilder sb = new StringBuilder(A).append(A);
		return sb.toString().contains(B);
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s1 = in.next();
		String s2 = in.next();
	    System.out.println(checkSam(s1,s2));
	}
}

在这里插入图片描述
在这里插入图片描述
题八:将字符串中按单词翻转

import java.util.Scanner;

public class LianXi {
    
    
	
	 static String reverse(String src){
    
    
		//首先将整个字符串按照字符翻转,再找到每个单词,将单词翻转
		String s1 = reverseString(src);
		String[] words = s1.split("\\s");
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i<words.length; i++){
    
    
			sb.append(reverseString(words[i]) + " ");
		}
		return sb.deleteCharAt(sb.length()-1).toString();
	}
	
	public static String reverseString(String s){
    
    
		StringBuilder sb = new StringBuilder(s);
		return sb.reverse().toString();
	}
	
	public static void main(String[] args){
    
    
		String res = reverse("here you are");
		System.out.println(res);
	}
	
}

在这里插入图片描述
题九:神奇的回文串
判断一个字符串是否为回文串

import java.util.Scanner;

public class LianXi {
    
    
	
	public static boolean isPalindrom(String s){
    
    
		if(s == null || s==""){
    
    
			return true;
		}
		return s.equals(new StringBuilder(s).reverse().toString());
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		String s = in.next();
		System.out.println(isPalindrom(s));
	}
}

在这里插入图片描述
回文数:
问题描述
  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
  按从小到大的顺序输出满足条件的四位十进制数。

public class LianXi {
    
    
		
	public static void main(String[] args){
    
    
		for(int i = 1; i<10; i++){
    
    
			for(int j = 0; j<10; j++){
    
    
				System.out.println(i*1000 + j*100 + j*10 + i);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/JiangYu200015/article/details/114845970