package leadcode; /** * 541. Reverse String II * Easy * 199 * 575 * * * Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original. * Example: * Input: s = "abcdefg", k = 2 * Output: "bacdfeg" * Restrictions: * The string consists of lower English letters only. * Length of the given string and k will in the range [1, 10000] */ public class L541 { public String reverseStr(String s, int k) { StringBuilder sb = new StringBuilder(); int len = s.length(); int count = len/(2*k)-1; int remaining = len%(2*k); if (remaining!=0){ count = count+1; } for (int i=0;i<=count;i++){ if(remaining!=0 && i==count){ int cout2k = 2*k*(i+1); int coutk = 2*k*i+k; if(len<coutk){ StringBuilder sb3 = reverse(s,2*k*i,len); sb.append(sb3); }else if(len<cout2k){ StringBuilder sb3 = reverse(s,2*k*i,coutk); sb.append(sb3); StringBuilder sb4 = retain(s,coutk,len); sb.append(sb4); } }else { StringBuilder sb1 = reverse(s,2*k*i,2*k*i+k); sb.append(sb1); StringBuilder sb2 = retain(s,2*k*i+k,2*k*(i+1)); sb.append(sb2); } } return new String(sb); } private StringBuilder reverse(String s,int begin,int end){ return new StringBuilder(s.substring(begin,end)).reverse(); } private StringBuilder retain(String s,int begin,int end){ return new StringBuilder(s.substring(begin,end)); } }
class Solution { public String reverseStr(String s, int k) { char[] str=s.toCharArray(); int i; int len=str.length; for(i=0;i<len;i+=2*k){ if(i+k-1 >= len || i+(2*k)-1 >= len) break; reverse(str,i,i+k-1); } // if < 2k if(i+k-1 < len) reverse(str,i,i+k-1); // if < k else if(i< len && i+k-1 >= len) reverse(str,i,len-1); return new String(str); } public void reverse(char[] str, int i, int j){ while(i<j){ char temp=str[i]; str[i]=str[j]; str[j]=temp; i++; j--; } } }
class Solution { public String reverseStr(String s, int k) { char[] a = s.toCharArray(); for (int start = 0; start < a.length; start += 2 * k) { int i = start, j = Math.min(start + k - 1, a.length - 1); while (i < j) { char tmp = a[i]; a[i++] = a[j]; a[j--] = tmp; } } return new String(a); } }