力扣算法题(五)字符串

双指针

344-Reverse String (了解一下递归的解法)

//编写一个函数,将输入的字符串反转过来,输入字符串以字符数组char[]的形式给出。
//不要另外分配额外的空间,必须原地修改输入数组,使用O(1)的额外空间解决这一问题。 //做对了,不需要额外复习!!!!!!!!!!!!!!!!!!!!!!!

public void reverseString(char[] s) {
   
		int n=s.length-1;char c=0;
		for(int i=0;i<=n/2;i++) {
   
			c=s[i];
			s[i]=s[n-i];
			s[n-i]=c;
		}
	}

345-Reverse Vowels of a String

//345反转字符穿的元音字母 //双指针,left right,判断是否元音字母,否则++,是的话交换再++
//这个解答是正确的,但是时间过长,应该找一个更好的判断元音字母方法 //可以这样判断,只是把if的顺序改一下!!!!!!!

public static String reverseVowels(String s) {
   
		int left=0,right=s.length()-1;
		char[] s1=s.toCharArray();
		while(left<right) {
   
			//循环停条件:left=right
			char l=s1[left];
			char r=s1[right];
			char sw=0;
			//单引号是char双引号是string
            //注意不要掉了大写字母
			if(l!='a'&&l!='e'&&l!='i'&&l!='o'&&l!='u'&&l!='A'&&l!='E'&&l!='I'&&l!='O'&&l!='U') {
   
				left++;
			}else if(r!='a'&&r!='e'&&r!='i'&&r!='o'&&r!='u'&&r!='A'&&r!='E'&&r!='I'&&r!='O'&&r!='U') {
   
				right--;
			}else {
   
				sw=s1[left];//System.out.println(sw);System.out.println(s1[right]);System.out.println(000);
				s1[left]=s1[right];
				s1[right]=sw;
				left++;
				right--;
			}
		}
		//s=s1.toString();
//		每一个对象的toString方法,都会打印出“类名@他的hashCode值”这样的一个字符串,数组是“[”这个符号C就代表char,后面的就是这个数组的hashCode值,如果是int类型的数组的话,就会使[I@*****了
		s=new String(s1);//这样是转成string
		return s;
	}

//为了快速判断,把所有元音字符加入到HashSet中,从而以O(1)的时间复杂度进行操作

private final static HashSet<Character> vowels=new HashSet<>(
			Arrays.asList('a','e','i','o','u','A','E','I','O','U')
			);
	public static String reverseVowels01(String s) {
   
		if(s==null)return null;
		int left=0,right=s.length()-1;
		char[] c=new char[s.length()];
//要加等号,因为我们这里是个空数组,必须把所有值都赋值进去
		while(left<right) {
   //循环停止条件是left=right+1
			//为什么这里要加等于号,上面的就不用????
			char cl=s.charAt(left);
			char cr=s.charAt(right);
			
			System.out.println(cl);System.out.println(cr);System.out.println("/");
			
			if(!vowels.contains(cl)) {
   
				c[left++]=cl;
			}else if(!vowels.contains(cr)) {
   
				c[right--]=cr;
			}else {
   
				c[left++]=cr;
				c[right--]=cl;
			}
		}
		return new String(c);
	}

917-Reverse Only Letters

//仅仅反转字母,给定一个字符串S,返回反转后的字符串,不是字母的留在原地,所有字母位置反转
//isLetter超出时间限制,Character.valueOf()也超出时间,并不是判断字母的原因,是因为,没有在交换后左移右移,已修改!!

public static String reverseOnlyLetters(String s) {
   
	char[] data=s.toCharArray();
	int left=0,right=data.length-1;
	char sss=0;
	while(left<right) {
   
//a-z:97-122,A-Z:65-90,可以直接使用isLetter函数
if(Character.valueOf(data[left])>122||Character.valueOf(data[left])<65||(Character.valueOf(data[left])>90&&(Character.valueOf(data[left])<97))) {
   
			left++;
		}else if(Character.valueOf(data[right])>122||Character.valueOf(data[right])<65||(Character.valueOf(data[right])>90&&(Character.valueOf(data[right])<97))) {
   
			right--;
		}else {
   
			sss=data[left];
			data[left]=data[right];
			data[right]=sss;
			left++;right--;
		}
	}
	
	s=new String(data);
	return s;
}	

//!!!!!!!!!!!!!将s的所有字母存入栈中,所以出栈等价于字母反序操作。 //遍历s所有字符,如果是字母选择栈顶输出

public String reverseOnlyLetters01(String S) {
   
	
	Stack<Character> letters=new Stack();//栈!!!!!!
	for(char c:S.toCharArray())
		if(Character.isLetter(c))
			letters.push(c);
	
	StringBuilder ans=new StringBuilder();
	for(char c:S.toCharArray()) {
   
		if(Character.isLetter(c))
			ans.append(letters.pop());
		else
			ans.append(c);
	}
	return ans.toString();//时间复杂度,空间复杂度,都是O(n)
}

925-Long Pressed Name

//输入name和typed //输入:name = “alex”, typed = “aaleex” //输出:true
//解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。 //示例 2: // //输入:name = “saeed”, typed =
“ssaaedd” //输出:false //解释:‘e’ 一定需要被键入两次,但在 typed 的输出中不是这样。 //示例 3: //
//输入:name = “leelee”, typed = “lleeelee” //输出:true //示例 4: //
//输入:name = “laiden”, typed = “laiden” //输出:true //解释:长按名字中的字符并不是必要的。

//只能多不能少

public boolean isLongPressedName(String name,String typed) {
   
	int i=0,j=0;
	while(i<name.length()) {
   
		if(name.charAt(i)==typed.charAt(j)){
   //charAt()
			i++;j++;
		}else if(j>0&&typed.charAt(j)==typed.charAt(j-1)) {
   
			//重复按,也就是和前一个相等
			j++;
		}else {
   
			return false;
		}
	}
	return i==name.length();//如果i遍历完全程就是对的
}

回文

125-Valid Palindrome

//验证回文串,只考虑字母和数字支付,忽略大小写,空字符串也是回文 //例子:输入: "A man, a plan, a canal:
Panama 输出: true //双指针,左右移动,相等移动,不是字母移动//A65,a97,差值是32
//解答错误,aa的话就是错误的,因为忘了考虑数字,加入数字aa
//这题绝对是对的!!!!!!!!!!!,但是判题通道说OP是true,用eclipse输出绝对是false
错了!!!,因为不是相差32的就是同一个字母,因为还有数字

public static boolean isPalindrome(String s) {
   
	int left=0,right=s.length()-1;
	while(left<right
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值