diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README.md b/solution/0000-0099/0005.Longest Palindromic Substring/README.md index 11a6b7df01a67..e4a000d7aa164 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README.md @@ -527,6 +527,55 @@ class Solution { } ``` +#### c + +```c +char *longestPalindrome(char *s) { + int n = strlen(s); + if (n == 0) { + char *result = malloc(1); + result[0] = '\0'; + return result; + } + + bool dp[n][n]; + memset(dp, 0, sizeof(dp)); + + int start = 0, max_len = 1; + + for (int i = 0; i < n; i++) { + dp[i][i] = true; + } + + for (int i = 0; i < n - 1; i++) { + if (s[i] == s[i + 1]) { + dp[i][i + 1] = true; + start = i; + max_len = 2; + } + } + + // Check for lengths > 2 + for (int len = 3; len <= n; len++) { + for (int i = 0; i < n - len + 1; i++) { + int j = i + len - 1; + if (s[i] == s[j] && dp[i + 1][j - 1]) { + dp[i][j] = true; + if (len > max_len) { + start = i; + max_len = len; + } + } + } + } + char *result = malloc(max_len + 1); + strncpy(result, s + start, max_len); + result[max_len] = '\0'; + return result; +} + +``` + diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md index 4ac2610fb4e8e..8b39b068c345c 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md @@ -525,6 +525,55 @@ class Solution { } ``` +#### C + +```c +char *longestPalindrome(char *s) { + int n = strlen(s); + if (n == 0) { + char *result = malloc(1); + result[0] = '\0'; + return result; + } + + bool dp[n][n]; + memset(dp, 0, sizeof(dp)); + + int start = 0, max_len = 1; + + for (int i = 0; i < n; i++) { + dp[i][i] = true; + } + + for (int i = 0; i < n - 1; i++) { + if (s[i] == s[i + 1]) { + dp[i][i + 1] = true; + start = i; + max_len = 2; + } + } + + // Check for lengths > 2 + for (int len = 3; len <= n; len++) { + for (int i = 0; i < n - len + 1; i++) { + int j = i + len - 1; + if (s[i] == s[j] && dp[i + 1][j - 1]) { + dp[i][j] = true; + if (len > max_len) { + start = i; + max_len = len; + } + } + } + } + char *result = malloc(max_len + 1); + strncpy(result, s + start, max_len); + result[max_len] = '\0'; + return result; +} + +``` + diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c new file mode 100644 index 0000000000000..26592c3a40353 --- /dev/null +++ b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c @@ -0,0 +1,45 @@ + + +char* longestPalindrome(char* s) { + int n = strlen(s); + if (n == 0) { + char* result = malloc(1); + result[0] = '\0'; + return result; + } + + bool dp[n][n]; + memset(dp, 0, sizeof(dp)); + + int start = 0, max_len = 1; + + for (int i = 0; i < n; i++) { + dp[i][i] = true; + } + + for (int i = 0; i < n - 1; i++) { + if (s[i] == s[i + 1]) { + dp[i][i + 1] = true; + start = i; + max_len = 2; + } + } + + // Check for lengths > 2 + for (int len = 3; len <= n; len++) { + for (int i = 0; i < n - len + 1; i++) { + int j = i + len - 1; + if (s[i] == s[j] && dp[i + 1][j - 1]) { + dp[i][j] = true; + if (len > max_len) { + start = i; + max_len = len; + } + } + } + } + char* result = malloc(max_len + 1); + strncpy(result, s + start, max_len); + result[max_len] = '\0'; + return result; +} diff --git a/solution/0000-0099/0006.Zigzag Conversion/README.md b/solution/0000-0099/0006.Zigzag Conversion/README.md index c12bad03a22aa..172268afc5ed9 100644 --- a/solution/0000-0099/0006.Zigzag Conversion/README.md +++ b/solution/0000-0099/0006.Zigzag Conversion/README.md @@ -493,6 +493,40 @@ class Solution { } ``` +#### C + +```C +char *convert(char *s, int numRows) { + if (numRows == 1 || numRows >= strlen(s)) { + char *result = malloc(strlen(s) + 1); + strcpy(result, s); + return result; + } + char **rows = malloc(numRows * sizeof(char *)); + for (int i = 0; i < numRows; i++) { + rows[i] = malloc(strlen(s) + 1); + rows[i][0] = '\0'; + } + int currentRow = 0; + int goingDown = 0; + for (int i = 0; s[i] != '\0'; i++) { + strncat(rows[currentRow], &s[i], 1); + if (currentRow == 0 || currentRow == numRows - 1) { + goingDown = !goingDown; + } + currentRow += goingDown ? 1 : -1; + } + char *result = malloc(strlen(s) + 1); + result[0] = '\0'; + for (int i = 0; i < numRows; i++) { + strcat(result, rows[i]); + free(rows[i]); + } + free(rows); + return result; +} +``` + diff --git a/solution/0000-0099/0006.Zigzag Conversion/README_EN.md b/solution/0000-0099/0006.Zigzag Conversion/README_EN.md index 04390da8f24e7..45bce03f21a1e 100644 --- a/solution/0000-0099/0006.Zigzag Conversion/README_EN.md +++ b/solution/0000-0099/0006.Zigzag Conversion/README_EN.md @@ -491,6 +491,40 @@ class Solution { } ``` +#### + +```c +char *convert(char *s, int numRows) { + if (numRows == 1 || numRows >= strlen(s)) { + char *result = malloc(strlen(s) + 1); + strcpy(result, s); + return result; + } + char **rows = malloc(numRows * sizeof(char *)); + for (int i = 0; i < numRows; i++) { + rows[i] = malloc(strlen(s) + 1); + rows[i][0] = '\0'; + } + int currentRow = 0; + int goingDown = 0; + for (int i = 0; s[i] != '\0'; i++) { + strncat(rows[currentRow], &s[i], 1); + if (currentRow == 0 || currentRow == numRows - 1) { + goingDown = !goingDown; + } + currentRow += goingDown ? 1 : -1; + } + char *result = malloc(strlen(s) + 1); + result[0] = '\0'; + for (int i = 0; i < numRows; i++) { + strcat(result, rows[i]); + free(rows[i]); + } + free(rows); + return result; +} +``` + diff --git a/solution/0000-0099/0006.Zigzag Conversion/Solution.c b/solution/0000-0099/0006.Zigzag Conversion/Solution.c new file mode 100644 index 0000000000000..0c23f5da5b410 --- /dev/null +++ b/solution/0000-0099/0006.Zigzag Conversion/Solution.c @@ -0,0 +1,29 @@ +char *convert(char *s, int numRows) { + if (numRows == 1 || numRows >= strlen(s)) { + char *result = malloc(strlen(s) + 1); + strcpy(result, s); + return result; + } + char **rows = malloc(numRows * sizeof(char *)); + for (int i = 0; i < numRows; i++) { + rows[i] = malloc(strlen(s) + 1); + rows[i][0] = '\0'; + } + int currentRow = 0; + int goingDown = 0; + for (int i = 0; s[i] != '\0'; i++) { + strncat(rows[currentRow], &s[i], 1); + if (currentRow == 0 || currentRow == numRows - 1) { + goingDown = !goingDown; + } + currentRow += goingDown ? 1 : -1; + } + char *result = malloc(strlen(s) + 1); + result[0] = '\0'; + for (int i = 0; i < numRows; i++) { + strcat(result, rows[i]); + free(rows[i]); + } + free(rows); + return result; +} \ No newline at end of file